1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=atom -march=x86-64 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Additional tests for 64-bit divide bypass 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i64 @Test_get_quotient(i64 %a, i64 %b) nounwind { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_quotient: 9*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, %rax 10*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testq $-65536, %rax 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 13*9880d681SAndroid Build Coastguard Worker; CHECK: idivq 14*9880d681SAndroid Build Coastguard Worker; CHECK: ret 15*9880d681SAndroid Build Coastguard Worker; CHECK: divw 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret 17*9880d681SAndroid Build Coastguard Worker %result = sdiv i64 %a, %b 18*9880d681SAndroid Build Coastguard Worker ret i64 %result 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i64 @Test_get_remainder(i64 %a, i64 %b) nounwind { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_remainder: 23*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, %rax 24*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testq $-65536, %rax 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 27*9880d681SAndroid Build Coastguard Worker; CHECK: idivq 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret 29*9880d681SAndroid Build Coastguard Worker; CHECK: divw 30*9880d681SAndroid Build Coastguard Worker; CHECK: ret 31*9880d681SAndroid Build Coastguard Worker %result = srem i64 %a, %b 32*9880d681SAndroid Build Coastguard Worker ret i64 %result 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i64 @Test_get_quotient_and_remainder(i64 %a, i64 %b) nounwind { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_quotient_and_remainder: 37*9880d681SAndroid Build Coastguard Worker; CHECK: movq %rdi, %rax 38*9880d681SAndroid Build Coastguard Worker; CHECK: orq %rsi, %rax 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testq $-65536, %rax 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je 41*9880d681SAndroid Build Coastguard Worker; CHECK: idivq 42*9880d681SAndroid Build Coastguard Worker; CHECK: divw 43*9880d681SAndroid Build Coastguard Worker; CHECK: addq 44*9880d681SAndroid Build Coastguard Worker; CHECK: ret 45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: idivq 46*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: divw 47*9880d681SAndroid Build Coastguard Worker %resultdiv = sdiv i64 %a, %b 48*9880d681SAndroid Build Coastguard Worker %resultrem = srem i64 %a, %b 49*9880d681SAndroid Build Coastguard Worker %result = add i64 %resultdiv, %resultrem 50*9880d681SAndroid Build Coastguard Worker ret i64 %result 51*9880d681SAndroid Build Coastguard Worker} 52