Modify return pseudo-instructions to have pairs of registers: virtual and real. This allows us to constrain the virtual registers to the real ones specified by the abi, instead of directly emitting moves to those real registers.
462 lines
7.6 KiB
Plaintext
462 lines
7.6 KiB
Plaintext
test compile precise-output
|
|
target s390x
|
|
|
|
function %bitrev_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = bitrev v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v0, 0(%r3)
|
|
; vrepib %v4, 170
|
|
; vrepib %v6, 1
|
|
; vsl %v16, %v0, %v6
|
|
; vsrl %v18, %v0, %v6
|
|
; vsel %v20, %v16, %v18, %v4
|
|
; vrepib %v22, 204
|
|
; vrepib %v24, 2
|
|
; vsl %v26, %v20, %v24
|
|
; vsrl %v28, %v20, %v24
|
|
; vsel %v30, %v26, %v28, %v22
|
|
; vrepib %v0, 240
|
|
; vrepib %v2, 4
|
|
; vsl %v4, %v30, %v2
|
|
; vsrl %v6, %v30, %v2
|
|
; vsel %v16, %v4, %v6, %v0
|
|
; bras %r1, 20 ; data.u128 0x0f0e0d0c0b0a09080706050403020100 ; vl %v18, 0(%r1)
|
|
; vperm %v20, %v16, %v16, %v18
|
|
; vst %v20, 0(%r2)
|
|
; br %r14
|
|
|
|
function %bitrev_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = bitrev v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgr %r4, %r2
|
|
; llihf %r2, 2863311530
|
|
; iilf %r2, 2863311530
|
|
; lgr %r3, %r4
|
|
; sllg %r4, %r3, 1
|
|
; srlg %r3, %r3, 1
|
|
; ngr %r4, %r2
|
|
; xilf %r2, 4294967295
|
|
; xihf %r2, 4294967295
|
|
; ngrk %r2, %r3, %r2
|
|
; ogrk %r5, %r4, %r2
|
|
; llihf %r4, 3435973836
|
|
; iilf %r4, 3435973836
|
|
; sllg %r2, %r5, 2
|
|
; srlg %r5, %r5, 2
|
|
; ngr %r2, %r4
|
|
; xilf %r4, 4294967295
|
|
; xihf %r4, 4294967295
|
|
; ngrk %r4, %r5, %r4
|
|
; ogrk %r3, %r2, %r4
|
|
; llihf %r2, 4042322160
|
|
; iilf %r2, 4042322160
|
|
; sllg %r4, %r3, 4
|
|
; srlg %r3, %r3, 4
|
|
; ngr %r4, %r2
|
|
; xilf %r2, 4294967295
|
|
; xihf %r2, 4294967295
|
|
; ngrk %r2, %r3, %r2
|
|
; ogr %r4, %r2
|
|
; lrvgr %r2, %r4
|
|
; br %r14
|
|
|
|
function %bitrev_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = bitrev v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; iilf %r4, 2863311530
|
|
; sllk %r3, %r2, 1
|
|
; srlk %r5, %r2, 1
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; ork %r4, %r2, %r3
|
|
; iilf %r2, 3435973836
|
|
; sllk %r5, %r4, 2
|
|
; srlk %r3, %r4, 2
|
|
; nrk %r4, %r5, %r2
|
|
; xilf %r2, 4294967295
|
|
; nrk %r5, %r3, %r2
|
|
; ork %r2, %r4, %r5
|
|
; iilf %r4, 4042322160
|
|
; sllk %r3, %r2, 4
|
|
; srlk %r5, %r2, 4
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; ork %r4, %r2, %r3
|
|
; lrvr %r2, %r4
|
|
; br %r14
|
|
|
|
function %bitrev_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = bitrev v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lhi %r4, -21846
|
|
; sllk %r3, %r2, 1
|
|
; srlk %r5, %r2, 1
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; ork %r4, %r2, %r3
|
|
; lhi %r2, -13108
|
|
; sllk %r5, %r4, 2
|
|
; srlk %r3, %r4, 2
|
|
; nrk %r4, %r5, %r2
|
|
; xilf %r2, 4294967295
|
|
; nrk %r5, %r3, %r2
|
|
; ork %r2, %r4, %r5
|
|
; lhi %r4, -3856
|
|
; sllk %r3, %r2, 4
|
|
; srlk %r5, %r2, 4
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; ork %r4, %r2, %r3
|
|
; lrvr %r2, %r4
|
|
; srlk %r2, %r2, 16
|
|
; br %r14
|
|
|
|
function %bitrev_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = bitrev v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lhi %r4, -21846
|
|
; sllk %r3, %r2, 1
|
|
; srlk %r5, %r2, 1
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; ork %r4, %r2, %r3
|
|
; lhi %r2, -13108
|
|
; sllk %r5, %r4, 2
|
|
; srlk %r3, %r4, 2
|
|
; nrk %r4, %r5, %r2
|
|
; xilf %r2, 4294967295
|
|
; nrk %r5, %r3, %r2
|
|
; ork %r2, %r4, %r5
|
|
; lhi %r4, -3856
|
|
; sllk %r3, %r2, 4
|
|
; srlk %r5, %r2, 4
|
|
; nrk %r2, %r3, %r4
|
|
; xilf %r4, 4294967295
|
|
; nrk %r3, %r5, %r4
|
|
; or %r2, %r3
|
|
; br %r14
|
|
|
|
function %clz_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = clz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v0, 0(%r3)
|
|
; vclzg %v4, %v0
|
|
; vgbm %v6, 0
|
|
; vpdi %v16, %v6, %v4, 0
|
|
; vpdi %v18, %v6, %v4, 1
|
|
; vag %v20, %v16, %v18
|
|
; vrepig %v22, 64
|
|
; vceqg %v24, %v16, %v22
|
|
; vsel %v26, %v20, %v16, %v24
|
|
; vst %v26, 0(%r2)
|
|
; br %r14
|
|
|
|
function %clz_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = clz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; flogr %r2, %r2
|
|
; br %r14
|
|
|
|
function %clz_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = clz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; llgfr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -32
|
|
; br %r14
|
|
|
|
function %clz_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = clz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; llghr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -48
|
|
; br %r14
|
|
|
|
function %clz_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = clz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; llgcr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -56
|
|
; br %r14
|
|
|
|
function %cls_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = cls v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v0, 0(%r3)
|
|
; vrepib %v4, 255
|
|
; vsrab %v6, %v0, %v4
|
|
; vsra %v16, %v6, %v4
|
|
; vx %v18, %v0, %v16
|
|
; vclzg %v20, %v18
|
|
; vgbm %v22, 0
|
|
; vpdi %v24, %v22, %v20, 0
|
|
; vpdi %v26, %v22, %v20, 1
|
|
; vag %v28, %v24, %v26
|
|
; vrepig %v30, 64
|
|
; vceqg %v0, %v24, %v30
|
|
; vsel %v2, %v28, %v24, %v0
|
|
; vaq %v4, %v2, %v4
|
|
; vst %v4, 0(%r2)
|
|
; br %r14
|
|
|
|
function %cls_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = cls v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; srag %r4, %r2, 63
|
|
; xgr %r2, %r4
|
|
; flogr %r2, %r2
|
|
; aghi %r2, -1
|
|
; br %r14
|
|
|
|
function %cls_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = cls v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgfr %r4, %r2
|
|
; srag %r2, %r4, 63
|
|
; xgr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -33
|
|
; br %r14
|
|
|
|
function %cls_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = cls v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lghr %r4, %r2
|
|
; srag %r2, %r4, 63
|
|
; xgr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -49
|
|
; br %r14
|
|
|
|
function %cls_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = cls v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgbr %r4, %r2
|
|
; srag %r2, %r4, 63
|
|
; xgr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; ahi %r2, -57
|
|
; br %r14
|
|
|
|
function %ctz_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = ctz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v0, 0(%r3)
|
|
; vctzg %v4, %v0
|
|
; vgbm %v6, 0
|
|
; vpdi %v16, %v6, %v4, 0
|
|
; vpdi %v18, %v6, %v4, 1
|
|
; vag %v20, %v16, %v18
|
|
; vrepig %v22, 64
|
|
; vceqg %v24, %v18, %v22
|
|
; vsel %v26, %v20, %v18, %v24
|
|
; vst %v26, 0(%r2)
|
|
; br %r14
|
|
|
|
function %ctz_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = ctz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lcgr %r4, %r2
|
|
; ngr %r2, %r4
|
|
; flogr %r2, %r2
|
|
; lgr %r3, %r2
|
|
; locghie %r3, -1
|
|
; lghi %r5, 63
|
|
; sgrk %r2, %r5, %r3
|
|
; br %r14
|
|
|
|
function %ctz_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = ctz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgr %r4, %r2
|
|
; oihl %r4, 1
|
|
; lcgr %r2, %r4
|
|
; ngr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; lhi %r5, 63
|
|
; srk %r2, %r5, %r2
|
|
; br %r14
|
|
|
|
function %ctz_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = ctz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgr %r4, %r2
|
|
; oilh %r4, 1
|
|
; lcgr %r2, %r4
|
|
; ngr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; lhi %r5, 63
|
|
; srk %r2, %r5, %r2
|
|
; br %r14
|
|
|
|
function %ctz_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = ctz v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; lgr %r4, %r2
|
|
; oill %r4, 256
|
|
; lcgr %r2, %r4
|
|
; ngr %r4, %r2
|
|
; flogr %r2, %r4
|
|
; lhi %r5, 63
|
|
; srk %r2, %r5, %r2
|
|
; br %r14
|
|
|
|
function %popcnt_i128(i128) -> i128 {
|
|
block0(v0: i128):
|
|
v1 = popcnt v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; vl %v0, 0(%r3)
|
|
; vpopctg %v4, %v0
|
|
; vgbm %v6, 0
|
|
; vpdi %v16, %v6, %v4, 0
|
|
; vpdi %v18, %v6, %v4, 1
|
|
; vag %v20, %v16, %v18
|
|
; vst %v20, 0(%r2)
|
|
; br %r14
|
|
|
|
function %popcnt_i64(i64) -> i64 {
|
|
block0(v0: i64):
|
|
v1 = popcnt v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; popcnt %r4, %r2
|
|
; sllg %r2, %r4, 32
|
|
; agr %r4, %r2
|
|
; sllg %r2, %r4, 16
|
|
; agr %r4, %r2
|
|
; sllg %r2, %r4, 8
|
|
; agr %r4, %r2
|
|
; srlg %r2, %r4, 56
|
|
; br %r14
|
|
|
|
function %popcnt_i32(i32) -> i32 {
|
|
block0(v0: i32):
|
|
v1 = popcnt v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; popcnt %r4, %r2
|
|
; sllk %r2, %r4, 16
|
|
; ar %r4, %r2
|
|
; sllk %r2, %r4, 8
|
|
; ar %r4, %r2
|
|
; srlk %r2, %r4, 24
|
|
; br %r14
|
|
|
|
function %popcnt_i16(i16) -> i16 {
|
|
block0(v0: i16):
|
|
v1 = popcnt v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; popcnt %r4, %r2
|
|
; srlk %r2, %r4, 8
|
|
; ark %r2, %r4, %r2
|
|
; nill %r2, 255
|
|
; br %r14
|
|
|
|
function %popcnt_i8(i8) -> i8 {
|
|
block0(v0: i8):
|
|
v1 = popcnt v0
|
|
return v1
|
|
}
|
|
|
|
; block0:
|
|
; popcnt %r2, %r2
|
|
; br %r14
|
|
|