s390x: Add support for all remaining atomic operations (#3746)
This adds support for all atomic operations that were unimplemented so far in the s390x back end: - atomic_rmw operations xchg, nand, smin, smax, umin, umax - $I8 and $I16 versions of atomic_rmw and atomic_cas - little endian versions of atomic_rmw and atomic_cas All of these have to be implemented by a compare-and-swap loop; and for the $I8 and $I16 versions the actual atomic instruction needs to operate on the surrounding aligned 32-bit word. Since we cannot emit new control flow during ISLE instruction selection, these compare-and-swap loops are emitted as a single meta-instruction to be expanded at emit time. However, since there is a large number of different versions of the loop required to implement all the above operations, I've implemented a facility to allow specifying the loop bodies from within ISLE after all, by creating a vector of MInst structures that will be emitted as part of the meta-instruction. There are still restrictions, in particular instructions that are part of the loop body may not modify any virtual register. But even so, this approach looks preferable to doing everything in emit.rs. A few instructions needed in those compare-and-swap loop bodies were added as well, in particular the RxSBG family of instructions as well as the LOAD REVERSED in-register byte-swap instructions. This patch also adds filetest runtests to verify the semantics of all operations, in particular the subword and little-endian variants (those are currently only executed on s390x).
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
test compile
|
||||
target s390x
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_CAS
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_cas_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_cas.i64 little v2, v0, v1
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r2
|
||||
; nextln: lrvgr %r3, %r3
|
||||
; nextln: csg %r2, %r3, 0(%r4)
|
||||
; nextln: lrvgr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_cas_i32(i32, i32, i64) -> i32 {
|
||||
block0(v0: i32, v1: i32, v2: i64):
|
||||
v3 = atomic_cas.i32 little v2, v0, v1
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r2
|
||||
; nextln: lrvr %r3, %r3
|
||||
; nextln: cs %r2, %r3, 0(%r4)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_cas_i16(i64, i16, i16, i64) -> i16 {
|
||||
block0(v0: i64, v1: i16, v2: i16, v3: i64):
|
||||
v4 = atomic_cas.i16 little v3, v1, v2
|
||||
return v4
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r5, 3
|
||||
; nextln: nill %r5, 65532
|
||||
; nextln: lrvr %r3, %r3
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r5)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rxsbg %r1, %r3, 176, 64, 48 ; jglh 1f ; risbgn %r1, %r4, 48, 64, 48 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r5) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_cas_i8(i64, i8, i8, i64) -> i8 {
|
||||
block0(v0: i64, v1: i8, v2: i8, v3: i64):
|
||||
v4 = atomic_cas.i8 little v3, v1, v2
|
||||
return v4
|
||||
}
|
||||
|
||||
; check: stmg %r14, %r15, 112(%r15)
|
||||
; nextln: sllk %r2, %r5, 3
|
||||
; nextln: nill %r5, 65532
|
||||
; nextln: lcr %r14, %r2
|
||||
; nextln: l %r0, 0(%r5)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r3, 160, 40, 24 ; jglh 1f ; risbgn %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r14) ; cs %r0, %r1, 0(%r5) ; jglh 0b
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: lmg %r14, %r15, 112(%r15)
|
||||
; nextln: br %r14
|
||||
|
||||
@@ -23,3 +23,32 @@ block0(v0: i32, v1: i32, v2: i64):
|
||||
; check: cs %r2, %r3, 0(%r4)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_cas_i16(i64, i16, i16, i64) -> i16 {
|
||||
block0(v0: i64, v1: i16, v2: i16, v3: i64):
|
||||
v4 = atomic_cas.i16 v3, v1, v2
|
||||
return v4
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r5, 3
|
||||
; nextln: nill %r5, 65532
|
||||
; nextln: l %r0, 0(%r5)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r3, 160, 48, 16 ; jglh 1f ; risbgn %r1, %r4, 32, 48, 16 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r5) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_cas_i8(i64, i8, i8, i64) -> i8 {
|
||||
block0(v0: i64, v1: i8, v2: i8, v3: i64):
|
||||
v4 = atomic_cas.i8 v3, v1, v2
|
||||
return v4
|
||||
}
|
||||
|
||||
; check: stmg %r14, %r15, 112(%r15)
|
||||
; nextln: sllk %r2, %r5, 3
|
||||
; nextln: nill %r5, 65532
|
||||
; nextln: lcr %r14, %r2
|
||||
; nextln: l %r0, 0(%r5)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r3, 160, 40, 24 ; jglh 1f ; risbgn %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r14) ; cs %r0, %r1, 0(%r5) ; jglh 0b
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: lmg %r14, %r15, 112(%r15)
|
||||
; nextln: br %r14
|
||||
|
||||
|
||||
105
cranelift/filetests/filetests/isa/s390x/atomic_rmw-arch13.clif
Normal file
105
cranelift/filetests/filetests/isa/s390x/atomic_rmw-arch13.clif
Normal file
@@ -0,0 +1,105 @@
|
||||
test compile
|
||||
target s390x arch13
|
||||
|
||||
function %atomic_rmw_nand_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: nngrk %r1, %r0, %r4 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: nnrk %r1, %r0, %r4 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 48, 16 ; xilf %r1, 4294901760 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; xilf %r1, 4278190080 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: lg %r0, 0(%r3)
|
||||
; nextln: 0: nngrk %r1, %r0, %r2 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: nnrk %r1, %r0, %r2 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rnsbg %r1, %r4, 48, 64, 48 ; xilf %r1, 65535 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; xilf %r1, 4278190080 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
620
cranelift/filetests/filetests/isa/s390x/atomic_rmw-little.clif
Normal file
620
cranelift/filetests/filetests/isa/s390x/atomic_rmw-little.clif
Normal file
@@ -0,0 +1,620 @@
|
||||
test compile
|
||||
target s390x
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (XCHG)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_xchg_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: lg %r0, 0(%r3)
|
||||
; nextln: 0: csg %r0, %r2, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: cs %r0, %r2, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; risbgn %r1, %r4, 48, 64, 48 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; risbgn %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (ADD)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_add_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; agr %r1, %r4 ; lrvgr %r1, %r1 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_add_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; ar %r1, %r4 ; lrvr %r1, %r1 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_add_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; ar %r1, %r4 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_add_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; ar %r1, %r4 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SUB)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_sub_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; sgr %r1, %r4 ; lrvgr %r1, %r1 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_sub_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; sr %r1, %r4 ; lrvr %r1, %r1 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_sub_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; sr %r1, %r4 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_sub_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; sr %r1, %r4 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (AND)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_and_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: lang %r2, %r2, 0(%r3)
|
||||
; nextln: lrvgr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_and_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: lan %r2, %r2, 0(%r3)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_and_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rnsbg %r1, %r4, 48, 64, 48 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_and_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (OR)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_or_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: laog %r2, %r2, 0(%r3)
|
||||
; nextln: lrvgr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_or_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: lao %r2, %r2, 0(%r3)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_or_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rosbg %r1, %r4, 48, 64, 48 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_or_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rosbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (XOR)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_xor_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: laxg %r2, %r2, 0(%r3)
|
||||
; nextln: lrvgr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xor_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: lax %r2, %r2, 0(%r3)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xor_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rxsbg %r1, %r4, 48, 64, 48 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xor_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (NAND)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_nand_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvgr %r2, %r4
|
||||
; nextln: lg %r0, 0(%r3)
|
||||
; nextln: 0: ngrk %r1, %r0, %r2 ; xilf %r1, 4294967295 ; xihf %r1, 4294967295 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lrvr %r2, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: nrk %r1, %r0, %r2 ; xilf %r1, 4294967295 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lrvr %r4, %r4
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; rnsbg %r1, %r4, 48, 64, 48 ; xilf %r1, 65535 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; xilf %r1, 4278190080 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SMIN)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_smin_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; cgr %r4, %r1 ; jgnl 1f ; lrvgr %r1, %r4 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; cr %r4, %r1 ; jgnl 1f ; lrvr %r1, %r4 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; cr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 48, 0 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SMAX)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_smax_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; cgr %r4, %r1 ; jgnh 1f ; lrvgr %r1, %r4 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; cr %r4, %r1 ; jgnh 1f ; lrvr %r1, %r4 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; cr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 48, 0 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (UMIN)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_umin_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; clgr %r4, %r1 ; jgnl 1f ; lrvgr %r1, %r4 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; clr %r4, %r1 ; jgnl 1f ; lrvr %r1, %r4 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; clr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 48, 0 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (UMAX)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_umax_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 little umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: lrvgr %r1, %r0 ; clgr %r4, %r1 ; jgnh 1f ; lrvgr %r1, %r4 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 little umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: lrvr %r1, %r0 ; clr %r4, %r1 ; jgnh 1f ; lrvr %r1, %r4 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lrvr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 little umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 16(%r2) ; lrvr %r1, %r1 ; clr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 48, 0 ; lrvr %r1, %r1 ; rll %r1, %r1, 16(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 0(%r2)
|
||||
; nextln: lrvr %r2, %r2
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 little umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
@@ -1,6 +1,59 @@
|
||||
test compile
|
||||
target s390x
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (XCHG)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_xchg_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: csg %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: cs %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; risbgn %r1, %r4, 32, 48, 16 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xchg_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 xchg v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; risbgn %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (ADD)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -23,6 +76,35 @@ block0(v0: i64, v1: i32):
|
||||
; check: laa %r2, %r3, 0(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_add_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; ar %r1, %r4 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_add_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 add v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; ar %r1, %r4 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SUB)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -47,6 +129,35 @@ block0(v0: i64, v1: i32):
|
||||
; nextln: laa %r2, %r3, 0(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_sub_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; sr %r1, %r4 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_sub_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 sub v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; sr %r1, %r4 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (AND)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -69,6 +180,33 @@ block0(v0: i64, v1: i32):
|
||||
; check: lan %r2, %r3, 0(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_and_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 48, 16 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_and_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 and v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (OR)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -91,6 +229,33 @@ block0(v0: i64, v1: i32):
|
||||
; check: lao %r2, %r3, 0(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_or_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rosbg %r1, %r4, 32, 48, 16 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_or_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 or v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rosbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (XOR)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -112,3 +277,304 @@ block0(v0: i64, v1: i32):
|
||||
|
||||
; check: lax %r2, %r3, 0(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xor_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r4, 32, 48, 16 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_xor_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 xor v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rxsbg %r1, %r4, 32, 40, 24 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (NAND)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_nand_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: ngrk %r1, %r0, %r4 ; xilf %r1, 4294967295 ; xihf %r1, 4294967295 ; csg %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: nrk %r1, %r0, %r4 ; xilf %r1, 4294967295 ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 48, 16 ; xilf %r1, 4294901760 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_nand_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 nand v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; rnsbg %r1, %r4, 32, 40, 24 ; xilf %r1, 4278190080 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SMIN)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_smin_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: cgr %r4, %r0 ; jgnl 1f ; csg %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: cr %r4, %r0 ; jgnl 1f ; cs %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 48, 0 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smin_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 smin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (SMAX)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_smax_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: cgr %r4, %r0 ; jgnh 1f ; csg %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: cr %r4, %r0 ; jgnh 1f ; cs %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 48, 0 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_smax_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 smax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; cr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (UMIN)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_umin_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: clgr %r4, %r0 ; jgnl 1f ; csg %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: clr %r4, %r0 ; jgnl 1f ; cs %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 48, 0 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umin_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 umin v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnl 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ATOMIC_RMW (UMAX)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
function %atomic_rmw_umax_i64(i64, i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64, v2: i64):
|
||||
v3 = atomic_rmw.i64 umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: lg %r0, 0(%r3)
|
||||
; nextln: 0: clgr %r4, %r0 ; jgnh 1f ; csg %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lgr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i32(i64, i64, i32) -> i32 {
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = atomic_rmw.i32 umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: l %r0, 0(%r3)
|
||||
; nextln: 0: clr %r4, %r0 ; jgnh 1f ; cs %r0, %r4, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: lr %r2, %r0
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i16(i64, i64, i16) -> i16 {
|
||||
block0(v0: i64, v1: i64, v2: i16):
|
||||
v3 = atomic_rmw.i16 umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 16
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 48, 0 ; rll %r1, %r1, 0(%r2) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 16(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
function %atomic_rmw_umax_i8(i64, i64, i8) -> i8 {
|
||||
block0(v0: i64, v1: i64, v2: i8):
|
||||
v3 = atomic_rmw.i8 umax v1, v2
|
||||
return v3
|
||||
}
|
||||
|
||||
; check: sllk %r2, %r3, 3
|
||||
; nextln: nill %r3, 65532
|
||||
; nextln: sllk %r4, %r4, 24
|
||||
; nextln: lcr %r5, %r2
|
||||
; nextln: l %r0, 0(%r3)
|
||||
; nextln: 0: rll %r1, %r0, 0(%r2) ; clr %r4, %r1 ; jgnh 1f ; risbgn %r1, %r4, 32, 40, 0 ; rll %r1, %r1, 0(%r5) ; cs %r0, %r1, 0(%r3) ; jglh 0b ; 1:
|
||||
; nextln: rll %r2, %r0, 8(%r2)
|
||||
; nextln: br %r14
|
||||
|
||||
|
||||
Reference in New Issue
Block a user