aarch64: Add popcnt for i128 values
This commit is contained in:
@@ -207,6 +207,24 @@ block0(v0: i64):
|
||||
; nextln: ldp fp, lr, [sp], #16
|
||||
; nextln: ret
|
||||
|
||||
function %d(i128) -> i128 {
|
||||
block0(v0: i128):
|
||||
v1 = popcnt v0
|
||||
return v1
|
||||
}
|
||||
|
||||
; check: stp fp, lr, [sp, #-16]!
|
||||
; nextln: mov fp, sp
|
||||
; nextln: fmov d0, x0
|
||||
; nextln: mov v0.d[1], x1
|
||||
; nextln: cnt v0.16b, v0.16b
|
||||
; nextln: addv b0, v0.16b
|
||||
; nextln: umov w0, v0.b[0]
|
||||
; nextln: movz x1, #0
|
||||
; nextln: ldp fp, lr, [sp], #16
|
||||
; nextln: ret
|
||||
|
||||
|
||||
function %d(i64) -> i64 {
|
||||
block0(v0: i64):
|
||||
v1 = popcnt v0
|
||||
|
||||
@@ -25,3 +25,20 @@ block0(v0: i64, v1: i64):
|
||||
; run: %clz(0x00000000_00010000, 0x00000001_00000000) == 31
|
||||
; run: %clz(0x00000000_00010000, 0x00000000_00000000) == 111
|
||||
; run: %clz(0x00000000_00000000, 0x00000000_00000000) == 128
|
||||
|
||||
function %popcnt_i128(i64, i64) -> i64 {
|
||||
block0(v0: i64, v1: i64):
|
||||
v2 = iconcat v0, v1
|
||||
|
||||
v3 = popcnt v2
|
||||
|
||||
v4, v5 = isplit v3
|
||||
v6 = iadd v4, v5
|
||||
return v6
|
||||
}
|
||||
; run: %popcnt_i128(0, 0) == 0
|
||||
; run: %popcnt_i128(-1, 0) == 64
|
||||
; run: %popcnt_i128(0, -1) == 64
|
||||
; run: %popcnt_i128(-1, -1) == 128
|
||||
; run: %popcnt_i128(0x55555555_55555555, 0x55555555_55555555) == 64
|
||||
; run: %popcnt_i128(0xC0FFEEEE_DECAFFFF, 0xDECAFFFF_C0FFEEEE) == 96
|
||||
Reference in New Issue
Block a user