| Index: tests_lit/llvm2ice_tests/64bit.pnacl.ll
|
| diff --git a/tests_lit/llvm2ice_tests/64bit.pnacl.ll b/tests_lit/llvm2ice_tests/64bit.pnacl.ll
|
| index c5cf07cf159262438d24f4fb4927ecf5901d1c58..6c50d18cecc0d3fe60b0dae0499809690b25cb20 100644
|
| --- a/tests_lit/llvm2ice_tests/64bit.pnacl.ll
|
| +++ b/tests_lit/llvm2ice_tests/64bit.pnacl.ll
|
| @@ -2,10 +2,20 @@
|
| ; particular the patterns for lowering i64 operations into constituent
|
| ; i32 operations on x86-32.
|
|
|
| -; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 \
|
| -; RUN: | FileCheck %s
|
| -; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 \
|
| -; RUN: | FileCheck --check-prefix=OPTM1 %s
|
| +; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
|
| +; RUN: --target x8632 -i %s --args -O2 \
|
| +; RUN: | %if --need=target_X8632 --command FileCheck %s
|
| +
|
| +; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
|
| +; RUN: --target x8632 -i %s --args -Om1 \
|
| +; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s
|
| +
|
| +; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented)
|
| +; once enough infrastructure is in. Also, switch to --filetype=obj
|
| +; when possible.
|
| +; RUN: %if --need=target_ARM32 --command %p2i --filetype=asm --assemble \
|
| +; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \
|
| +; RUN: | %if --need=target_ARM32 --command FileCheck --check-prefix ARM32 %s
|
|
|
| @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4
|
| @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4
|
| @@ -114,6 +124,10 @@ entry:
|
| ; OPTM1: mov {{.*}},DWORD PTR [esp+0x4]
|
| ; OPTM1: mov {{.*}},DWORD PTR [esp+0x8]
|
|
|
| +; Nothing to do for ARM O2 -- arg and return value are in r0,r1.
|
| +; ARM32-LABEL: return64BitArg
|
| +; ARM32-NEXT: bx lr
|
| +
|
| define internal i64 @return64BitConst() {
|
| entry:
|
| ret i64 -2401053092306725256
|
| @@ -126,6 +140,12 @@ entry:
|
| ; OPTM1: mov eax,0x12345678
|
| ; OPTM1: mov edx,0xdeadbeef
|
|
|
| +; ARM32-LABEL: return64BitConst
|
| +; ARM32: movw r0, #22136 ; 0x5678
|
| +; ARM32: movt r0, #4660 ; 0x1234
|
| +; ARM32: movw r1, #48879 ; 0xbeef
|
| +; ARM32: movt r1, #57005 ; 0xdead
|
| +
|
| define internal i64 @add64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %add = add i64 %b, %a
|
| @@ -139,6 +159,10 @@ entry:
|
| ; OPTM1: add
|
| ; OPTM1: adc
|
|
|
| +; ARM32-LABEL: add64BitSigned
|
| +; ARM32: adds
|
| +; ARM32: adc
|
| +
|
| define internal i64 @add64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %add = add i64 %b, %a
|
| @@ -152,6 +176,10 @@ entry:
|
| ; OPTM1: add
|
| ; OPTM1: adc
|
|
|
| +; ARM32-LABEL: add64BitUnsigned
|
| +; ARM32: adds
|
| +; ARM32: adc
|
| +
|
| define internal i64 @sub64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %sub = sub i64 %a, %b
|
| @@ -165,6 +193,10 @@ entry:
|
| ; OPTM1: sub
|
| ; OPTM1: sbb
|
|
|
| +; ARM32-LABEL: sub64BitSigned
|
| +; ARM32: subs
|
| +; ARM32: sbc
|
| +
|
| define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %sub = sub i64 %a, %b
|
| @@ -178,6 +210,10 @@ entry:
|
| ; OPTM1: sub
|
| ; OPTM1: sbb
|
|
|
| +; ARM32-LABEL: sub64BitUnsigned
|
| +; ARM32: subs
|
| +; ARM32: sbc
|
| +
|
| define internal i64 @mul64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %mul = mul i64 %b, %a
|
| @@ -197,6 +233,12 @@ entry:
|
| ; OPTM1: add
|
| ; OPTM1: add
|
|
|
| +; ARM32-LABEL: mul64BitSigned
|
| +; ARM32: mul
|
| +; ARM32: mla
|
| +; ARM32: umull
|
| +; ARM32: add
|
| +
|
| define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %mul = mul i64 %b, %a
|
| @@ -216,6 +258,12 @@ entry:
|
| ; OPTM1: add
|
| ; OPTM1: add
|
|
|
| +; ARM32-LABEL: mul64BitUnsigned
|
| +; ARM32: mul
|
| +; ARM32: mla
|
| +; ARM32: umull
|
| +; ARM32: add
|
| +
|
| define internal i64 @div64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %div = sdiv i64 %a, %b
|
| @@ -413,6 +461,10 @@ entry:
|
| ; OPTM1: and
|
| ; OPTM1: and
|
|
|
| +; ARM32-LABEL: and64BitSigned
|
| +; ARM32: and
|
| +; ARM32: and
|
| +
|
| define internal i64 @and64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %and = and i64 %b, %a
|
| @@ -426,6 +478,10 @@ entry:
|
| ; OPTM1: and
|
| ; OPTM1: and
|
|
|
| +; ARM32-LABEL: and64BitUnsigned
|
| +; ARM32: and
|
| +; ARM32: and
|
| +
|
| define internal i64 @or64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %or = or i64 %b, %a
|
| @@ -439,6 +495,10 @@ entry:
|
| ; OPTM1: or
|
| ; OPTM1: or
|
|
|
| +; ARM32-LABEL: or64BitSigned
|
| +; ARM32: orr
|
| +; ARM32: orr
|
| +
|
| define internal i64 @or64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %or = or i64 %b, %a
|
| @@ -452,6 +512,10 @@ entry:
|
| ; OPTM1: or
|
| ; OPTM1: or
|
|
|
| +; ARM32-LABEL: or64BitUnsigned
|
| +; ARM32: orr
|
| +; ARM32: orr
|
| +
|
| define internal i64 @xor64BitSigned(i64 %a, i64 %b) {
|
| entry:
|
| %xor = xor i64 %b, %a
|
| @@ -465,6 +529,10 @@ entry:
|
| ; OPTM1: xor
|
| ; OPTM1: xor
|
|
|
| +; ARM32-LABEL: xor64BitSigned
|
| +; ARM32: eor
|
| +; ARM32: eor
|
| +
|
| define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) {
|
| entry:
|
| %xor = xor i64 %b, %a
|
| @@ -478,6 +546,10 @@ entry:
|
| ; OPTM1: xor
|
| ; OPTM1: xor
|
|
|
| +; ARM32-LABEL: xor64BitUnsigned
|
| +; ARM32: eor
|
| +; ARM32: eor
|
| +
|
| define internal i32 @trunc64To32Signed(i64 %a) {
|
| entry:
|
| %conv = trunc i64 %a to i32
|
| @@ -746,6 +818,20 @@ if.end3: ; preds = %if.then2, %if.end
|
| ; OPTM1: je
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpEq64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: moveq
|
| +; ARM32: movne
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: moveq
|
| +; ARM32: movne
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| declare void @func()
|
|
|
| define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) {
|
| @@ -784,6 +870,20 @@ if.end3: ; preds = %if.end, %if.then2
|
| ; OPTM1: jne
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpNe64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movne
|
| +; ARM32: moveq
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movne
|
| +; ARM32: moveq
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) {
|
| entry:
|
| %cmp = icmp ugt i64 %a, %b
|
| @@ -824,6 +924,20 @@ if.end3: ; preds = %if.then2, %if.end
|
| ; OPTM1: ja
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpGt64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movhi
|
| +; ARM32: movls
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: sbcs
|
| +; ARM32: movlt
|
| +; ARM32: movge
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) {
|
| entry:
|
| %cmp = icmp uge i64 %a, %b
|
| @@ -864,6 +978,20 @@ if.end3: ; preds = %if.end, %if.then2
|
| ; OPTM1: jae
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpGe64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movcs
|
| +; ARM32: movcc
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: sbcs
|
| +; ARM32: movge
|
| +; ARM32: movlt
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) {
|
| entry:
|
| %cmp = icmp ult i64 %a, %b
|
| @@ -904,6 +1032,20 @@ if.end3: ; preds = %if.then2, %if.end
|
| ; OPTM1: jb
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpLt64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movcc
|
| +; ARM32: movcs
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: sbcs
|
| +; ARM32: movlt
|
| +; ARM32: movge
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) {
|
| entry:
|
| %cmp = icmp ule i64 %a, %b
|
| @@ -944,6 +1086,20 @@ if.end3: ; preds = %if.end, %if.then2
|
| ; OPTM1: jbe
|
| ; OPTM1: call
|
|
|
| +; ARM32-LABEL: icmpLe64
|
| +; ARM32: cmp
|
| +; ARM32: cmpeq
|
| +; ARM32: movls
|
| +; ARM32: movhi
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +; ARM32: cmp
|
| +; ARM32: sbcs
|
| +; ARM32: movge
|
| +; ARM32: movlt
|
| +; ARM32: beq
|
| +; ARM32: bl
|
| +
|
| define internal i32 @icmpEq64Bool(i64 %a, i64 %b) {
|
| entry:
|
| %cmp = icmp eq i64 %a, %b
|
| @@ -1275,6 +1431,8 @@ if.end3: ; preds = %if.then2, %if.end
|
| ; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
|
| ; OPTM1-LABEL: icmpEq64Imm
|
| ; OPTM1-LABEL-NOT: cmp 0x{{[0-9a-f]+}},
|
| +; ARM32-LABEL: icmpEq64Imm
|
| +; ARM32-NOT: cmp #{{[0-9a-f]+}},
|
|
|
| define internal void @icmpLt64Imm() {
|
| entry:
|
| @@ -1302,3 +1460,5 @@ if.end3: ; preds = %if.then2, %if.end
|
| ; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
|
| ; OPTM1-LABEL: icmpLt64Imm
|
| ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}},
|
| +; ARM32-LABEL: icmpLt64Imm
|
| +; ARM32-NOT: cmp #{{[0-9a-f]+}},
|
|
|