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..097dbfd5bbe8b2a4a205f6adbaacf827a15fae50 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,21 @@ 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 |
+; TODO(jvoung): need to get param from stack |
+; TODOARM32: cmpeq |
+; 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 +979,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 |
+; TODOARM32: cmpeq |
+; 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 +1033,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 |
+; TODOARM32: cmpeq |
+; 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 +1087,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 |
+; TODOARM32: cmpeq |
+; 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 +1432,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 +1461,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]+}}, |