1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that basic 64-bit floating-point comparison operations assemble as 4*9880d681SAndroid Build Coastguard Worker; expected. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 7*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown" 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ord_f64: 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $0, $0{{$}} 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $1, $1{{$}} 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}} 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM2]]{{$}} 16*9880d681SAndroid Build Coastguard Workerdefine i32 @ord_f64(double %x, double %y) { 17*9880d681SAndroid Build Coastguard Worker %a = fcmp ord double %x, %y 18*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 19*9880d681SAndroid Build Coastguard Worker ret i32 %b 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uno_f64: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $0, $0{{$}} 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $1, $1{{$}} 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}} 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM2]]{{$}} 29*9880d681SAndroid Build Coastguard Workerdefine i32 @uno_f64(double %x, double %y) { 30*9880d681SAndroid Build Coastguard Worker %a = fcmp uno double %x, %y 31*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 32*9880d681SAndroid Build Coastguard Worker ret i32 %b 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oeq_f64: 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM:[0-9]+]]=, $0, $1{{$}} 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 40*9880d681SAndroid Build Coastguard Workerdefine i32 @oeq_f64(double %x, double %y) { 41*9880d681SAndroid Build Coastguard Worker %a = fcmp oeq double %x, %y 42*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 43*9880d681SAndroid Build Coastguard Worker ret i32 %b 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: une_f64: 47*9880d681SAndroid Build Coastguard Worker; CHECK: f64.ne $push[[NUM:[0-9]+]]=, $0, $1{{$}} 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 49*9880d681SAndroid Build Coastguard Workerdefine i32 @une_f64(double %x, double %y) { 50*9880d681SAndroid Build Coastguard Worker %a = fcmp une double %x, %y 51*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 52*9880d681SAndroid Build Coastguard Worker ret i32 %b 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: olt_f64: 56*9880d681SAndroid Build Coastguard Worker; CHECK: f64.lt $push[[NUM:[0-9]+]]=, $0, $1{{$}} 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 58*9880d681SAndroid Build Coastguard Workerdefine i32 @olt_f64(double %x, double %y) { 59*9880d681SAndroid Build Coastguard Worker %a = fcmp olt double %x, %y 60*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 61*9880d681SAndroid Build Coastguard Worker ret i32 %b 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ole_f64: 65*9880d681SAndroid Build Coastguard Worker; CHECK: f64.le $push[[NUM:[0-9]+]]=, $0, $1{{$}} 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 67*9880d681SAndroid Build Coastguard Workerdefine i32 @ole_f64(double %x, double %y) { 68*9880d681SAndroid Build Coastguard Worker %a = fcmp ole double %x, %y 69*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 70*9880d681SAndroid Build Coastguard Worker ret i32 %b 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ogt_f64: 74*9880d681SAndroid Build Coastguard Worker; CHECK: f64.gt $push[[NUM:[0-9]+]]=, $0, $1{{$}} 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 76*9880d681SAndroid Build Coastguard Workerdefine i32 @ogt_f64(double %x, double %y) { 77*9880d681SAndroid Build Coastguard Worker %a = fcmp ogt double %x, %y 78*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 79*9880d681SAndroid Build Coastguard Worker ret i32 %b 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: oge_f64: 83*9880d681SAndroid Build Coastguard Worker; CHECK: f64.ge $push[[NUM:[0-9]+]]=, $0, $1{{$}} 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM]]{{$}} 85*9880d681SAndroid Build Coastguard Workerdefine i32 @oge_f64(double %x, double %y) { 86*9880d681SAndroid Build Coastguard Worker %a = fcmp oge double %x, %y 87*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 88*9880d681SAndroid Build Coastguard Worker ret i32 %b 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; Expanded comparisons, which also check for NaN. 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ueq_f64: 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]]{{$}} 102*9880d681SAndroid Build Coastguard Workerdefine i32 @ueq_f64(double %x, double %y) { 103*9880d681SAndroid Build Coastguard Worker %a = fcmp ueq double %x, %y 104*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 105*9880d681SAndroid Build Coastguard Worker ret i32 %b 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: one_f64: 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.eq $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.and $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.and $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]] 117*9880d681SAndroid Build Coastguard Workerdefine i32 @one_f64(double %x, double %y) { 118*9880d681SAndroid Build Coastguard Worker %a = fcmp one double %x, %y 119*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 120*9880d681SAndroid Build Coastguard Worker ret i32 %b 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ult_f64: 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.lt $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]]{{$}} 132*9880d681SAndroid Build Coastguard Workerdefine i32 @ult_f64(double %x, double %y) { 133*9880d681SAndroid Build Coastguard Worker %a = fcmp ult double %x, %y 134*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 135*9880d681SAndroid Build Coastguard Worker ret i32 %b 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ule_f64: 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.le $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]]{{$}} 147*9880d681SAndroid Build Coastguard Workerdefine i32 @ule_f64(double %x, double %y) { 148*9880d681SAndroid Build Coastguard Worker %a = fcmp ule double %x, %y 149*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 150*9880d681SAndroid Build Coastguard Worker ret i32 %b 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ugt_f64: 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.gt $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]]{{$}} 162*9880d681SAndroid Build Coastguard Workerdefine i32 @ugt_f64(double %x, double %y) { 163*9880d681SAndroid Build Coastguard Worker %a = fcmp ugt double %x, %y 164*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 165*9880d681SAndroid Build Coastguard Worker ret i32 %b 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: uge_f64: 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result i32{{$}} 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ge $push[[NUM0:[0-9]+]]=, $0, $1{{$}} 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}} 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}} 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}} 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}} 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop[[NUM4]]{{$}} 177*9880d681SAndroid Build Coastguard Workerdefine i32 @uge_f64(double %x, double %y) { 178*9880d681SAndroid Build Coastguard Worker %a = fcmp uge double %x, %y 179*9880d681SAndroid Build Coastguard Worker %b = zext i1 %a to i32 180*9880d681SAndroid Build Coastguard Worker ret i32 %b 181*9880d681SAndroid Build Coastguard Worker} 182