s390x: use full vector register file for FP operations (#4360)

This defines the full set of 32 128-bit vector registers on s390x.
(Note that the VRs overlap the existing FPRs.)  In addition, this
adds support to use all 32 vector registers to implement floating-
point operations, by using vector floating-point instructions with
the 'W' bit set to operate only on the first element.

This part of the vector instruction set mostly matches the old FP
instruction set, with two exceptions:

- There is no vector version of the COPY SIGN instruction.  Instead,
  now use a VECTOR SELECT with an appropriate bit mask to implement
  the fcopysign operation.

- There are no vector version of the float <-> int conversion
  instructions where source and target differ in bit size.  Use
  appropriate multiple conversion steps instead.  This also requires
  use of explicit checking to implement correct overflow handling.
  As a side effect, this version now also implements the i8 / i16
  variants of all conversions, which had been missing so far.

For all operations except those two above, we continue to use the
old FP instruction if applicable (i.e. if all operands happen to
have been allocated to the original FP register set), and use the
vector instruction otherwise.
This commit is contained in:
Ulrich Weigand
2022-07-01 01:33:39 +02:00
committed by GitHub
parent f252ae34ec
commit ec83144c88
13 changed files with 3380 additions and 1100 deletions

View File

@@ -0,0 +1,736 @@
test compile precise-output
target s390x arch13
function %fcvt_to_uint_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_uint.i8 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 256 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wclfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_sint.i8 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 128 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -129 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wcfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_uint.i16 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 65536 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wclfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_sint.i16 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 32768 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -32769 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wcfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f32_i32(f32) -> i32 {
block0(v0: f32):
v1 = fcvt_to_uint.i32 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 4294967300 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wclfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f32_i32(f32) -> i32 {
block0(v0: f32):
v1 = fcvt_to_sint.i32 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 2147483600 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -2147484000 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wcfeb %v21, %f0, 0, 5
; vlgvf %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f32_i64(f32) -> i64 {
block0(v0: f32):
v1 = fcvt_to_uint.i64 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 18446744000000000000 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wclgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_sint_f32_i64(f32) -> i64 {
block0(v0: f32):
v1 = fcvt_to_sint.i64 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 9223372000000000000 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -9223373000000000000 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wcgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_uint_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint.i8 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 256 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_sint.i8 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 128 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -129 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint.i16 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 65536 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint.i16 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 32768 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -32769 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i32(f64) -> i32 {
block0(v0: f64):
v1 = fcvt_to_uint.i32 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 4294967296 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i32(f64) -> i32 {
block0(v0: f64):
v1 = fcvt_to_sint.i32 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 2147483648 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -2147483649 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i64(f64) -> i64 {
block0(v0: f64):
v1 = fcvt_to_uint.i64 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 18446744073709552000 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i64(f64) -> i64 {
block0(v0: f64):
v1 = fcvt_to_sint.i64 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 9223372036854776000 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -9223372036854778000 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_from_uint_i8_f32(i8) -> f32 {
block0(v0: i8):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; llcr %r5, %r2
; vlvgf %v5, %r5, 0
; wcelfb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i8_f32(i8) -> f32 {
block0(v0: i8):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; lbr %r5, %r2
; vlvgf %v5, %r5, 0
; wcefb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i16_f32(i16) -> f32 {
block0(v0: i16):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; llhr %r5, %r2
; vlvgf %v5, %r5, 0
; wcelfb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i16_f32(i16) -> f32 {
block0(v0: i16):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; lhr %r5, %r2
; vlvgf %v5, %r5, 0
; wcefb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i32_f32(i32) -> f32 {
block0(v0: i32):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; vlvgf %v3, %r2, 0
; wcelfb %f0, %f3, 0, 4
; br %r14
function %fcvt_from_sint_i32_f32(i32) -> f32 {
block0(v0: i32):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; vlvgf %v3, %r2, 0
; wcefb %f0, %f3, 0, 4
; br %r14
function %fcvt_from_uint_i64_f32(i64) -> f32 {
block0(v0: i64):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; ldgr %f3, %r2
; wcdlgb %f5, %f3, 0, 3
; ledbra %f0, %f5, 4
; br %r14
function %fcvt_from_sint_i64_f32(i64) -> f32 {
block0(v0: i64):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; ldgr %f3, %r2
; wcdgb %f5, %f3, 0, 3
; ledbra %f0, %f5, 4
; br %r14
function %fcvt_from_uint_i8_f64(i8) -> f64 {
block0(v0: i8):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; llgcr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i8_f64(i8) -> f64 {
block0(v0: i8):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; lgbr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i16_f64(i16) -> f64 {
block0(v0: i16):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; llghr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i16_f64(i16) -> f64 {
block0(v0: i16):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; lghr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i32_f64(i32) -> f64 {
block0(v0: i32):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; llgfr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i32_f64(i32) -> f64 {
block0(v0: i32):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; lgfr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i64_f64(i64) -> f64 {
block0(v0: i64):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; ldgr %f3, %r2
; wcdlgb %f0, %f3, 0, 4
; br %r14
function %fcvt_from_sint_i64_f64(i64) -> f64 {
block0(v0: i64):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; ldgr %f3, %r2
; wcdgb %f0, %f3, 0, 4
; br %r14
function %fcvt_to_uint_sat_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i8 v0
return v1
}
; block0:
; wclfeb %f3, %f0, 0, 5
; vlgvf %r3, %v3, 0
; lgr %r2, %r3
; clfi %r3, 256
; lochih %r2, 255
; br %r14
function %fcvt_to_sint_sat_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i8 v0
return v1
}
; block0:
; wcfeb %f3, %f0, 0, 5
; vlgvf %r3, %v3, 0
; cebr %f0, %f0
; lochio %r3, 0
; lgr %r4, %r3
; chi %r3, 127
; lochih %r4, 127
; lgr %r2, %r4
; chi %r4, -128
; lochil %r2, -128
; br %r14
function %fcvt_to_uint_sat_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i16 v0
return v1
}
; block0:
; wclfeb %f3, %f0, 0, 5
; vlgvf %r3, %v3, 0
; lgr %r2, %r3
; clfi %r3, 65535
; lochih %r2, -1
; br %r14
function %fcvt_to_sint_sat_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i16 v0
return v1
}
; block0:
; wcfeb %f3, %f0, 0, 5
; vlgvf %r3, %v3, 0
; cebr %f0, %f0
; lochio %r3, 0
; lgr %r4, %r3
; chi %r3, 32767
; lochih %r4, 32767
; lgr %r2, %r4
; chi %r4, -32768
; lochil %r2, -32768
; br %r14
function %fcvt_to_uint_sat_f32_i32(f32) -> i32 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i32 v0
return v1
}
; block0:
; wclfeb %f3, %f0, 0, 5
; vlgvf %r2, %v3, 0
; br %r14
function %fcvt_to_sint_sat_f32_i32(f32) -> i32 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i32 v0
return v1
}
; block0:
; wcfeb %f3, %f0, 0, 5
; vlgvf %r2, %v3, 0
; cebr %f0, %f0
; lochio %r2, 0
; br %r14
function %fcvt_to_uint_sat_f32_i64(f32) -> i64 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i64 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wclgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; br %r14
function %fcvt_to_sint_sat_f32_i64(f32) -> i64 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i64 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wcgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; cebr %f0, %f0
; locghio %r2, 0
; br %r14
function %fcvt_to_uint_sat_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i8 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; lgr %r2, %r3
; clgfi %r3, 256
; locghih %r2, 255
; br %r14
function %fcvt_to_sint_sat_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i8 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; cdbr %f0, %f0
; locghio %r3, 0
; lgr %r4, %r3
; cghi %r3, 127
; locghih %r4, 127
; lgr %r2, %r4
; cghi %r4, -128
; locghil %r2, -128
; br %r14
function %fcvt_to_uint_sat_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i16 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; lgr %r2, %r3
; clgfi %r3, 65535
; locghih %r2, -1
; br %r14
function %fcvt_to_sint_sat_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i16 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; cdbr %f0, %f0
; locghio %r3, 0
; lgr %r4, %r3
; cghi %r3, 32767
; locghih %r4, 32767
; lgr %r2, %r4
; cghi %r4, -32768
; locghil %r2, -32768
; br %r14
function %fcvt_to_uint_sat_f64_i32(f64) -> i32 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i32 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; llilf %r5, 4294967295
; clgr %r2, %r5
; locgrh %r2, %r5
; br %r14
function %fcvt_to_sint_sat_f64_i32(f64) -> i32 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i32 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; cdbr %f0, %f0
; locghio %r2, 0
; lgfi %r5, 2147483647
; cgr %r2, %r5
; locgrh %r2, %r5
; lgfi %r3, -2147483648
; cgr %r2, %r3
; locgrl %r2, %r3
; br %r14
function %fcvt_to_uint_sat_f64_i64(f64) -> i64 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i64 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; br %r14
function %fcvt_to_sint_sat_f64_i64(f64) -> i64 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i64 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; cdbr %f0, %f0
; locghio %r2, 0
; br %r14

View File

@@ -245,7 +245,7 @@ block0(v0: f64):
}
; block0:
; ledbr %f0, %f0
; ledbra %f0, %f0, 0
; br %r14
function %ceil_f32(f32) -> f32 {
@@ -335,9 +335,7 @@ block0(v0: f32, v1: f32, v2: f32):
}
; block0:
; ldr %f1, %f0
; ldr %f0, %f4
; maebr %f0, %f1, %f2
; wfmasb %f0, %f0, %f2, %f4
; br %r14
function %fma_f64(f64, f64, f64) -> f64 {
@@ -347,9 +345,7 @@ block0(v0: f64, v1: f64, v2: f64):
}
; block0:
; ldr %f1, %f0
; ldr %f0, %f4
; madbr %f0, %f1, %f2
; wfmadb %f0, %f0, %f2, %f4
; br %r14
function %fcopysign_f32(f32, f32) -> f32 {
@@ -359,7 +355,8 @@ block0(v0: f32, v1: f32):
}
; block0:
; cpsdr %f0, %f2, %f0
; bras %r1, 8 ; data.f32 NaN ; le %f5, 0(%r1)
; vsel %v0, %v0, %v2, %v5
; br %r14
function %fcopysign_f64(f64, f64) -> f64 {
@@ -369,7 +366,88 @@ block0(v0: f64, v1: f64):
}
; block0:
; cpsdr %f0, %f2, %f0
; bras %r1, 12 ; data.f64 NaN ; ld %f5, 0(%r1)
; vsel %v0, %v0, %v2, %v5
; br %r14
function %fcvt_to_uint_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_uint.i8 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 256 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wclgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_sint_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_sint.i8 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 128 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -129 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wcgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_uint_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_uint.i16 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 65536 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wclgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_sint_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_sint.i16 v0
return v1
}
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 32768 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -32769 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wcgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_uint_f32_i32(f32) -> i32 {
@@ -381,8 +459,15 @@ block0(v0: f32):
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; clfebr %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 4294967300 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wclgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_sint_f32_i32(f32) -> i32 {
@@ -394,8 +479,15 @@ block0(v0: f32):
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; cfebra %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 2147483600 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -2147484000 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wcgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_uint_f32_i64(f32) -> i64 {
@@ -407,8 +499,15 @@ block0(v0: f32):
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; clgebr %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 8 ; data.f32 18446744000000000000 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -1 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wclgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_sint_f32_i64(f32) -> i64 {
@@ -420,8 +519,91 @@ block0(v0: f32):
; block0:
; cebr %f0, %f0
; jno 6 ; trap
; cgebra %r2, 5, %f0, 0
; bras %r1, 8 ; data.f32 9223372000000000000 ; le %f5, 0(%r1)
; cebr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 8 ; data.f32 -9223373000000000000 ; vlef %v17, 0(%r1), 0
; wfcsb %f0, %v17
; jnle 6 ; trap
; wldeb %v21, %f0
; wcgdb %v23, %v21, 0, 5
; vlgvg %r2, %v23, 0
; br %r14
function %fcvt_to_uint_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint.i8 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 256 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_sint.i8 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 128 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -129 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint.i16 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 65536 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint.i16 v0
return v1
}
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 32768 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -32769 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i32(f64) -> i32 {
@@ -433,8 +615,14 @@ block0(v0: f64):
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; clfdbr %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 4294967296 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i32(f64) -> i32 {
@@ -446,8 +634,14 @@ block0(v0: f64):
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; cfdbra %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 2147483648 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -2147483649 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_uint_f64_i64(f64) -> i64 {
@@ -459,8 +653,14 @@ block0(v0: f64):
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; clgdbr %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 18446744073709552000 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -1 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wclgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_to_sint_f64_i64(f64) -> i64 {
@@ -472,8 +672,66 @@ block0(v0: f64):
; block0:
; cdbr %f0, %f0
; jno 6 ; trap
; cgdbra %r2, 5, %f0, 0
; jno 6 ; trap
; bras %r1, 12 ; data.f64 9223372036854776000 ; ld %f5, 0(%r1)
; cdbr %f0, %f5
; jnhe 6 ; trap
; bras %r1, 12 ; data.f64 -9223372036854778000 ; vleg %v17, 0(%r1), 0
; wfcdb %f0, %v17
; jnle 6 ; trap
; wcgdb %v21, %f0, 0, 5
; vlgvg %r2, %v21, 0
; br %r14
function %fcvt_from_uint_i8_f32(i8) -> f32 {
block0(v0: i8):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; llgcr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_sint_i8_f32(i8) -> f32 {
block0(v0: i8):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; lgbr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_uint_i16_f32(i16) -> f32 {
block0(v0: i16):
v1 = fcvt_from_uint.f32 v0
return v1
}
; block0:
; llghr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_sint_i16_f32(i16) -> f32 {
block0(v0: i16):
v1 = fcvt_from_sint.f32 v0
return v1
}
; block0:
; lghr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_uint_i32_f32(i32) -> f32 {
@@ -483,7 +741,10 @@ block0(v0: i32):
}
; block0:
; celfbr %f0, 0, %r2, 0
; llgfr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_sint_i32_f32(i32) -> f32 {
@@ -493,7 +754,10 @@ block0(v0: i32):
}
; block0:
; cefbra %f0, 0, %r2, 0
; lgfr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f7, %f5, 0, 3
; ledbra %f0, %f7, 4
; br %r14
function %fcvt_from_uint_i64_f32(i64) -> f32 {
@@ -503,7 +767,9 @@ block0(v0: i64):
}
; block0:
; celgbr %f0, 0, %r2, 0
; ldgr %f3, %r2
; wcdlgb %f5, %f3, 0, 3
; ledbra %f0, %f5, 4
; br %r14
function %fcvt_from_sint_i64_f32(i64) -> f32 {
@@ -513,7 +779,57 @@ block0(v0: i64):
}
; block0:
; cegbra %f0, 0, %r2, 0
; ldgr %f3, %r2
; wcdgb %f5, %f3, 0, 3
; ledbra %f0, %f5, 4
; br %r14
function %fcvt_from_uint_i8_f64(i8) -> f64 {
block0(v0: i8):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; llgcr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i8_f64(i8) -> f64 {
block0(v0: i8):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; lgbr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i16_f64(i16) -> f64 {
block0(v0: i16):
v1 = fcvt_from_uint.f64 v0
return v1
}
; block0:
; llghr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i16_f64(i16) -> f64 {
block0(v0: i16):
v1 = fcvt_from_sint.f64 v0
return v1
}
; block0:
; lghr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i32_f64(i32) -> f64 {
@@ -523,7 +839,9 @@ block0(v0: i32):
}
; block0:
; cdlfbr %f0, 0, %r2, 0
; llgfr %r5, %r2
; ldgr %f5, %r5
; wcdlgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_sint_i32_f64(i32) -> f64 {
@@ -533,7 +851,9 @@ block0(v0: i32):
}
; block0:
; cdfbra %f0, 0, %r2, 0
; lgfr %r5, %r2
; ldgr %f5, %r5
; wcdgb %f0, %f5, 0, 4
; br %r14
function %fcvt_from_uint_i64_f64(i64) -> f64 {
@@ -543,7 +863,8 @@ block0(v0: i64):
}
; block0:
; cdlgbr %f0, 0, %r2, 0
; ldgr %f3, %r2
; wcdlgb %f0, %f3, 0, 4
; br %r14
function %fcvt_from_sint_i64_f64(i64) -> f64 {
@@ -553,7 +874,78 @@ block0(v0: i64):
}
; block0:
; cdgbra %f0, 0, %r2, 0
; ldgr %f3, %r2
; wcdgb %f0, %f3, 0, 4
; br %r14
function %fcvt_to_uint_sat_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i8 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wclgdb %f5, %f3, 0, 5
; lgdr %r5, %f5
; lgr %r2, %r5
; clgfi %r5, 256
; locghih %r2, 255
; br %r14
function %fcvt_to_sint_sat_f32_i8(f32) -> i8 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i8 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wcgdb %f5, %f3, 0, 5
; lgdr %r5, %f5
; cebr %f0, %f0
; locghio %r5, 0
; lgr %r4, %r5
; cghi %r5, 127
; locghih %r4, 127
; lgr %r2, %r4
; cghi %r4, -128
; locghil %r2, -128
; br %r14
function %fcvt_to_uint_sat_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_uint_sat.i16 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wclgdb %f5, %f3, 0, 5
; lgdr %r5, %f5
; lgr %r2, %r5
; clgfi %r5, 65535
; locghih %r2, -1
; br %r14
function %fcvt_to_sint_sat_f32_i16(f32) -> i16 {
block0(v0: f32):
v1 = fcvt_to_sint_sat.i16 v0
return v1
}
; block0:
; ldebr %f3, %f0
; wcgdb %f5, %f3, 0, 5
; lgdr %r5, %f5
; cebr %f0, %f0
; locghio %r5, 0
; lgr %r4, %r5
; cghi %r5, 32767
; locghih %r4, 32767
; lgr %r2, %r4
; cghi %r4, -32768
; locghil %r2, -32768
; br %r14
function %fcvt_to_uint_sat_f32_i32(f32) -> i32 {
@@ -563,9 +955,12 @@ block0(v0: f32):
}
; block0:
; clfebr %r2, 5, %f0, 0
; cebr %f0, %f0
; lochio %r2, 0
; ldebr %f3, %f0
; wclgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; llilf %r3, 4294967295
; clgr %r2, %r3
; locgrh %r2, %r3
; br %r14
function %fcvt_to_sint_sat_f32_i32(f32) -> i32 {
@@ -575,9 +970,17 @@ block0(v0: f32):
}
; block0:
; cfebra %r2, 5, %f0, 0
; ldebr %f3, %f0
; wcgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; cebr %f0, %f0
; lochio %r2, 0
; locghio %r2, 0
; lgfi %r3, 2147483647
; cgr %r2, %r3
; locgrh %r2, %r3
; lgfi %r5, -2147483648
; cgr %r2, %r5
; locgrl %r2, %r5
; br %r14
function %fcvt_to_uint_sat_f32_i64(f32) -> i64 {
@@ -587,9 +990,9 @@ block0(v0: f32):
}
; block0:
; clgebr %r2, 5, %f0, 0
; cebr %f0, %f0
; locghio %r2, 0
; ldebr %f3, %f0
; wclgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; br %r14
function %fcvt_to_sint_sat_f32_i64(f32) -> i64 {
@@ -599,11 +1002,79 @@ block0(v0: f32):
}
; block0:
; cgebra %r2, 5, %f0, 0
; ldebr %f3, %f0
; wcgdb %f5, %f3, 0, 5
; lgdr %r2, %f5
; cebr %f0, %f0
; locghio %r2, 0
; br %r14
function %fcvt_to_uint_sat_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i8 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; lgr %r2, %r3
; clgfi %r3, 256
; locghih %r2, 255
; br %r14
function %fcvt_to_sint_sat_f64_i8(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i8 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; cdbr %f0, %f0
; locghio %r3, 0
; lgr %r4, %r3
; cghi %r3, 127
; locghih %r4, 127
; lgr %r2, %r4
; cghi %r4, -128
; locghil %r2, -128
; br %r14
function %fcvt_to_uint_sat_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i16 v0
return v1
}
; block0:
; wclgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; lgr %r2, %r3
; clgfi %r3, 65535
; locghih %r2, -1
; br %r14
function %fcvt_to_sint_sat_f64_i16(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i16 v0
return v1
}
; block0:
; wcgdb %f3, %f0, 0, 5
; lgdr %r3, %f3
; cdbr %f0, %f0
; locghio %r3, 0
; lgr %r4, %r3
; cghi %r3, 32767
; locghih %r4, 32767
; lgr %r2, %r4
; cghi %r4, -32768
; locghil %r2, -32768
; br %r14
function %fcvt_to_uint_sat_f64_i32(f64) -> i32 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i32 v0
@@ -611,9 +1082,11 @@ block0(v0: f64):
}
; block0:
; clfdbr %r2, 5, %f0, 0
; cdbr %f0, %f0
; lochio %r2, 0
; wclgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; llilf %r5, 4294967295
; clgr %r2, %r5
; locgrh %r2, %r5
; br %r14
function %fcvt_to_sint_sat_f64_i32(f64) -> i32 {
@@ -623,9 +1096,16 @@ block0(v0: f64):
}
; block0:
; cfdbra %r2, 5, %f0, 0
; wcgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; cdbr %f0, %f0
; lochio %r2, 0
; locghio %r2, 0
; lgfi %r5, 2147483647
; cgr %r2, %r5
; locgrh %r2, %r5
; lgfi %r3, -2147483648
; cgr %r2, %r3
; locgrl %r2, %r3
; br %r14
function %fcvt_to_uint_sat_f64_i64(f64) -> i64 {
@@ -635,9 +1115,8 @@ block0(v0: f64):
}
; block0:
; clgdbr %r2, 5, %f0, 0
; cdbr %f0, %f0
; locghio %r2, 0
; wclgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; br %r14
function %fcvt_to_sint_sat_f64_i64(f64) -> i64 {
@@ -647,7 +1126,8 @@ block0(v0: f64):
}
; block0:
; cgdbra %r2, 5, %f0, 0
; wcgdb %f3, %f0, 0, 5
; lgdr %r2, %f3
; cdbr %f0, %f0
; locghio %r2, 0
; br %r14
@@ -679,8 +1159,7 @@ block0(v0: i32):
}
; block0:
; sllg %r5, %r2, 32
; ldgr %f0, %r5
; vlvgf %v0, %r2, 0
; br %r14
function %bitcast_f32_i32(f32) -> i32 {
@@ -690,7 +1169,6 @@ block0(v0: f32):
}
; block0:
; lgdr %r5, %f0
; srlg %r2, %r5, 32
; vlgvf %r2, %v0, 0
; br %r14

View File

@@ -40,8 +40,7 @@ block0(v0: i64):
; block0:
; lrv %r5, 0(%r2)
; sllg %r3, %r5, 32
; ldgr %f0, %r3
; vlvgf %v0, %r5, 0
; br %r14
function %store_f64(f64, i64) {
@@ -82,8 +81,7 @@ block0(v0: f32, v1: i64):
}
; block0:
; lgdr %r3, %f0
; srlg %r4, %r3, 32
; strv %r4, 0(%r2)
; vlgvf %r3, %v0, 0
; strv %r3, 0(%r2)
; br %r14

View File

@@ -76,9 +76,9 @@ block1:
; bras %r1, 12 ; data.f64 1 ; ld %f2, 0(%r1)
; bras %r1, 12 ; data.f64 2 ; ld %f4, 0(%r1)
; bras %r1, 12 ; data.f64 3 ; ld %f6, 0(%r1)
; bras %r1, 12 ; data.f64 4 ; ld %f5, 0(%r1)
; bras %r1, 12 ; data.f64 5 ; ld %f7, 0(%r1)
; std %f5, 0(%r2)
; std %f7, 8(%r2)
; bras %r1, 12 ; data.f64 4 ; vleg %v28, 0(%r1), 0
; bras %r1, 12 ; data.f64 5 ; vleg %v31, 0(%r1), 0
; vsteg %v28, 0(%r2), 0
; vsteg %v31, 8(%r2), 0
; br %r14