s390x: Implement bitrev (#4617)
Since we do not have an instruction for this, this is a simple open-coded implementation. Needed by the cg_clif frontend.
This commit is contained in:
@@ -1,40 +1,163 @@
|
||||
test compile precise-output
|
||||
target s390x
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; BITREV
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
function %bitrev_i128(i128) -> i128 {
|
||||
block0(v0: i128):
|
||||
v1 = bitrev v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; FIXME: bitrev not yet implemented
|
||||
; block0:
|
||||
; vl %v0, 0(%r3)
|
||||
; vrepib %v5, 170
|
||||
; vrepib %v7, 1
|
||||
; vsl %v17, %v0, %v7
|
||||
; vsrl %v19, %v0, %v7
|
||||
; vsel %v21, %v17, %v19, %v5
|
||||
; vrepib %v23, 204
|
||||
; vrepib %v25, 2
|
||||
; vsl %v27, %v21, %v25
|
||||
; vsrl %v29, %v21, %v25
|
||||
; vsel %v31, %v27, %v29, %v23
|
||||
; vrepib %v1, 240
|
||||
; vrepib %v3, 4
|
||||
; vsl %v5, %v31, %v3
|
||||
; vsrl %v7, %v31, %v3
|
||||
; vsel %v17, %v5, %v7, %v1
|
||||
; bras %r1, 20 ; data.u128 0x0f0e0d0c0b0a09080706050403020100 ; vl %v19, 0(%r1)
|
||||
; vperm %v21, %v17, %v17, %v19
|
||||
; vst %v21, 0(%r2)
|
||||
; br %r14
|
||||
|
||||
;function %bitrev_i64(i64) -> i64 {
|
||||
;block0(v0: i64):
|
||||
; v1 = bitrev v0
|
||||
; return v1
|
||||
;}
|
||||
;
|
||||
;function %bitrev_i32(i32) -> i32 {
|
||||
;block0(v0: i32):
|
||||
; v1 = bitrev v0
|
||||
; return v1
|
||||
;}
|
||||
;
|
||||
;function %bitrev_i16(i16) -> i16 {
|
||||
;block0(v0: i16):
|
||||
; v1 = bitrev v0
|
||||
; return v1
|
||||
;}
|
||||
;
|
||||
;function %bitrev_i8(i8) -> i8 {
|
||||
;block0(v0: i8):
|
||||
; v1 = bitrev v0
|
||||
; return v1
|
||||
;}
|
||||
;
|
||||
function %bitrev_i64(i64) -> i64 {
|
||||
block0(v0: i64):
|
||||
v1 = bitrev v0
|
||||
return v1
|
||||
}
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; CLZ
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; block0:
|
||||
; llihf %r5, 2863311530
|
||||
; iilf %r5, 2863311530
|
||||
; sllg %r4, %r2, 1
|
||||
; srlg %r2, %r2, 1
|
||||
; ngr %r4, %r5
|
||||
; xilf %r5, 4294967295
|
||||
; xihf %r5, 4294967295
|
||||
; ngrk %r5, %r2, %r5
|
||||
; ogrk %r2, %r4, %r5
|
||||
; llihf %r4, 3435973836
|
||||
; iilf %r4, 3435973836
|
||||
; sllg %r3, %r2, 2
|
||||
; srlg %r5, %r2, 2
|
||||
; ngr %r3, %r4
|
||||
; xilf %r4, 4294967295
|
||||
; xihf %r4, 4294967295
|
||||
; ngrk %r4, %r5, %r4
|
||||
; ogrk %r5, %r3, %r4
|
||||
; llihf %r3, 4042322160
|
||||
; iilf %r3, 4042322160
|
||||
; sllg %r2, %r5, 4
|
||||
; srlg %r4, %r5, 4
|
||||
; ngr %r2, %r3
|
||||
; xilf %r3, 4294967295
|
||||
; xihf %r3, 4294967295
|
||||
; ngrk %r3, %r4, %r3
|
||||
; ogrk %r4, %r2, %r3
|
||||
; lrvgr %r2, %r4
|
||||
; br %r14
|
||||
|
||||
function %bitrev_i32(i32) -> i32 {
|
||||
block0(v0: i32):
|
||||
v1 = bitrev v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; block0:
|
||||
; iilf %r5, 2863311530
|
||||
; sllk %r3, %r2, 1
|
||||
; srlk %r2, %r2, 1
|
||||
; nr %r3, %r5
|
||||
; xilf %r5, 4294967295
|
||||
; nrk %r4, %r2, %r5
|
||||
; ork %r2, %r3, %r4
|
||||
; iilf %r4, 3435973836
|
||||
; sllk %r3, %r2, 2
|
||||
; srlk %r5, %r2, 2
|
||||
; nrk %r2, %r3, %r4
|
||||
; xilf %r4, 4294967295
|
||||
; nrk %r3, %r5, %r4
|
||||
; ork %r5, %r2, %r3
|
||||
; iilf %r3, 4042322160
|
||||
; sllk %r2, %r5, 4
|
||||
; srlk %r4, %r5, 4
|
||||
; nrk %r5, %r2, %r3
|
||||
; xilf %r3, 4294967295
|
||||
; nrk %r2, %r4, %r3
|
||||
; ork %r4, %r5, %r2
|
||||
; lrvr %r2, %r4
|
||||
; br %r14
|
||||
|
||||
function %bitrev_i16(i16) -> i16 {
|
||||
block0(v0: i16):
|
||||
v1 = bitrev v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; block0:
|
||||
; lhi %r5, -21846
|
||||
; sllk %r3, %r2, 1
|
||||
; srlk %r2, %r2, 1
|
||||
; nr %r3, %r5
|
||||
; xilf %r5, 4294967295
|
||||
; nrk %r4, %r2, %r5
|
||||
; ork %r2, %r3, %r4
|
||||
; lhi %r4, -13108
|
||||
; sllk %r3, %r2, 2
|
||||
; srlk %r5, %r2, 2
|
||||
; nrk %r2, %r3, %r4
|
||||
; xilf %r4, 4294967295
|
||||
; nrk %r3, %r5, %r4
|
||||
; ork %r5, %r2, %r3
|
||||
; lhi %r3, -3856
|
||||
; sllk %r2, %r5, 4
|
||||
; srlk %r4, %r5, 4
|
||||
; nrk %r5, %r2, %r3
|
||||
; xilf %r3, 4294967295
|
||||
; nrk %r2, %r4, %r3
|
||||
; ork %r4, %r5, %r2
|
||||
; lrvr %r2, %r4
|
||||
; srlk %r2, %r2, 16
|
||||
; br %r14
|
||||
|
||||
function %bitrev_i8(i8) -> i8 {
|
||||
block0(v0: i8):
|
||||
v1 = bitrev v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; block0:
|
||||
; lhi %r5, -21846
|
||||
; sllk %r3, %r2, 1
|
||||
; srlk %r2, %r2, 1
|
||||
; nr %r3, %r5
|
||||
; xilf %r5, 4294967295
|
||||
; nrk %r4, %r2, %r5
|
||||
; ork %r2, %r3, %r4
|
||||
; lhi %r4, -13108
|
||||
; sllk %r3, %r2, 2
|
||||
; srlk %r5, %r2, 2
|
||||
; nrk %r2, %r3, %r4
|
||||
; xilf %r4, 4294967295
|
||||
; nrk %r3, %r5, %r4
|
||||
; ork %r5, %r2, %r3
|
||||
; lhi %r3, -3856
|
||||
; sllk %r2, %r5, 4
|
||||
; srlk %r4, %r5, 4
|
||||
; nrk %r5, %r2, %r3
|
||||
; xilf %r3, 4294967295
|
||||
; nrk %r2, %r4, %r3
|
||||
; ork %r2, %r5, %r2
|
||||
; br %r14
|
||||
|
||||
function %clz_i128(i128) -> i128 {
|
||||
block0(v0: i128):
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
test interpret
|
||||
test run
|
||||
target aarch64
|
||||
target s390x
|
||||
target x86_64
|
||||
|
||||
function %bitrev_i8(i8) -> i8 {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
test run
|
||||
set enable_llvm_abi_extensions=true
|
||||
target aarch64
|
||||
target s390x
|
||||
target x86_64
|
||||
|
||||
function %reverse_bits_zero() -> b1 {
|
||||
|
||||
Reference in New Issue
Block a user