1; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s 2 3; Usually MIPS hosts uses a legacy (non IEEE 754-2008) encoding for NaNs. 4; Tests like `nan_f32` failed in attempt to compare hard-coded IEEE 754-2008 5; NaN value and a legacy NaN value provided by a system. 6; XFAIL: mips-, mipsel-, mips64-, mips64el- 7 8; Test that basic immediates assemble as expected. 9 10target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 11target triple = "wasm32-unknown-unknown" 12 13; CHECK-LABEL: zero_i32: 14; CHECK-NEXT: .functype zero_i32 () -> (i32){{$}} 15; CHECK-NEXT: i32.const $push[[NUM:[0-9]+]]=, 0{{$}} 16; CHECK-NEXT: return $pop[[NUM]]{{$}} 17define i32 @zero_i32() { 18 ret i32 0 19} 20 21; CHECK-LABEL: one_i32: 22; CHECK-NEXT: .functype one_i32 () -> (i32){{$}} 23; CHECK-NEXT: i32.const $push[[NUM:[0-9]+]]=, 1{{$}} 24; CHECK-NEXT: return $pop[[NUM]]{{$}} 25define i32 @one_i32() { 26 ret i32 1 27} 28 29; CHECK-LABEL: max_i32: 30; CHECK-NEXT: .functype max_i32 () -> (i32){{$}} 31; CHECK-NEXT: i32.const $push[[NUM:[0-9]+]]=, 2147483647{{$}} 32; CHECK-NEXT: return $pop[[NUM]]{{$}} 33define i32 @max_i32() { 34 ret i32 2147483647 35} 36 37; CHECK-LABEL: min_i32: 38; CHECK-NEXT: .functype min_i32 () -> (i32){{$}} 39; CHECK-NEXT: i32.const $push[[NUM:[0-9]+]]=, -2147483648{{$}} 40; CHECK-NEXT: return $pop[[NUM]]{{$}} 41define i32 @min_i32() { 42 ret i32 -2147483648 43} 44 45; CHECK-LABEL: zero_i64: 46; CHECK-NEXT: .functype zero_i64 () -> (i64){{$}} 47; CHECK-NEXT: i64.const $push[[NUM:[0-9]+]]=, 0{{$}} 48; CHECK-NEXT: return $pop[[NUM]]{{$}} 49define i64 @zero_i64() { 50 ret i64 0 51} 52 53; CHECK-LABEL: one_i64: 54; CHECK-NEXT: .functype one_i64 () -> (i64){{$}} 55; CHECK-NEXT: i64.const $push[[NUM:[0-9]+]]=, 1{{$}} 56; CHECK-NEXT: return $pop[[NUM]]{{$}} 57define i64 @one_i64() { 58 ret i64 1 59} 60 61; CHECK-LABEL: max_i64: 62; CHECK-NEXT: .functype max_i64 () -> (i64){{$}} 63; CHECK-NEXT: i64.const $push[[NUM:[0-9]+]]=, 9223372036854775807{{$}} 64; CHECK-NEXT: return $pop[[NUM]]{{$}} 65define i64 @max_i64() { 66 ret i64 9223372036854775807 67} 68 69; CHECK-LABEL: min_i64: 70; CHECK-NEXT: .functype min_i64 () -> (i64){{$}} 71; CHECK-NEXT: i64.const $push[[NUM:[0-9]+]]=, -9223372036854775808{{$}} 72; CHECK-NEXT: return $pop[[NUM]]{{$}} 73define i64 @min_i64() { 74 ret i64 -9223372036854775808 75} 76 77; CHECK-LABEL: negzero_f32: 78; CHECK-NEXT: .functype negzero_f32 () -> (f32){{$}} 79; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, -0x0p0{{$}} 80; CHECK-NEXT: return $pop[[NUM]]{{$}} 81define float @negzero_f32() { 82 ret float -0.0 83} 84 85; CHECK-LABEL: zero_f32: 86; CHECK-NEXT: .functype zero_f32 () -> (f32){{$}} 87; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, 0x0p0{{$}} 88; CHECK-NEXT: return $pop[[NUM]]{{$}} 89define float @zero_f32() { 90 ret float 0.0 91} 92 93; CHECK-LABEL: one_f32: 94; CHECK-NEXT: .functype one_f32 () -> (f32){{$}} 95; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, 0x1p0{{$}} 96; CHECK-NEXT: return $pop[[NUM]]{{$}} 97define float @one_f32() { 98 ret float 1.0 99} 100 101; CHECK-LABEL: two_f32: 102; CHECK-NEXT: .functype two_f32 () -> (f32){{$}} 103; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, 0x1p1{{$}} 104; CHECK-NEXT: return $pop[[NUM]]{{$}} 105define float @two_f32() { 106 ret float 2.0 107} 108 109; CHECK-LABEL: nan_f32: 110; CHECK-NEXT: .functype nan_f32 () -> (f32){{$}} 111; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, nan{{$}} 112; CHECK-NEXT: return $pop[[NUM]]{{$}} 113define float @nan_f32() { 114 ret float 0x7FF8000000000000 115} 116 117; CHECK-LABEL: negnan_f32: 118; CHECK-NEXT: .functype negnan_f32 () -> (f32){{$}} 119; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, -nan{{$}} 120; CHECK-NEXT: return $pop[[NUM]]{{$}} 121define float @negnan_f32() { 122 ret float 0xFFF8000000000000 123} 124 125; CHECK-LABEL: inf_f32: 126; CHECK-NEXT: .functype inf_f32 () -> (f32){{$}} 127; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, infinity{{$}} 128; CHECK-NEXT: return $pop[[NUM]]{{$}} 129define float @inf_f32() { 130 ret float 0x7FF0000000000000 131} 132 133; CHECK-LABEL: neginf_f32: 134; CHECK-NEXT: .functype neginf_f32 () -> (f32){{$}} 135; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, -infinity{{$}} 136; CHECK-NEXT: return $pop[[NUM]]{{$}} 137define float @neginf_f32() { 138 ret float 0xFFF0000000000000 139} 140 141; CHECK-LABEL: custom_nan_f32: 142; CHECK-NEXT: .functype custom_nan_f32 () -> (f32){{$}} 143; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, -nan:0x6bcdef{{$}} 144; CHECK-NEXT: return $pop[[NUM]]{{$}} 145define float @custom_nan_f32() { 146 ret float 0xFFFD79BDE0000000 147} 148 149; CHECK-LABEL: custom_nans_f32: 150; CHECK-NEXT: .functype custom_nans_f32 () -> (f32){{$}} 151; CHECK-NEXT: f32.const $push[[NUM:[0-9]+]]=, -nan:0x2bcdef{{$}} 152; CHECK-NEXT: return $pop[[NUM]]{{$}} 153define float @custom_nans_f32() { 154 ret float 0xFFF579BDE0000000 155} 156 157; CHECK-LABEL: negzero_f64: 158; CHECK-NEXT: .functype negzero_f64 () -> (f64){{$}} 159; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, -0x0p0{{$}} 160; CHECK-NEXT: return $pop[[NUM]]{{$}} 161define double @negzero_f64() { 162 ret double -0.0 163} 164 165; CHECK-LABEL: zero_f64: 166; CHECK-NEXT: .functype zero_f64 () -> (f64){{$}} 167; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, 0x0p0{{$}} 168; CHECK-NEXT: return $pop[[NUM]]{{$}} 169define double @zero_f64() { 170 ret double 0.0 171} 172 173; CHECK-LABEL: one_f64: 174; CHECK-NEXT: .functype one_f64 () -> (f64){{$}} 175; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, 0x1p0{{$}} 176; CHECK-NEXT: return $pop[[NUM]]{{$}} 177define double @one_f64() { 178 ret double 1.0 179} 180 181; CHECK-LABEL: two_f64: 182; CHECK-NEXT: .functype two_f64 () -> (f64){{$}} 183; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, 0x1p1{{$}} 184; CHECK-NEXT: return $pop[[NUM]]{{$}} 185define double @two_f64() { 186 ret double 2.0 187} 188 189; CHECK-LABEL: nan_f64: 190; CHECK-NEXT: .functype nan_f64 () -> (f64){{$}} 191; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, nan{{$}} 192; CHECK-NEXT: return $pop[[NUM]]{{$}} 193define double @nan_f64() { 194 ret double 0x7FF8000000000000 195} 196 197; CHECK-LABEL: negnan_f64: 198; CHECK-NEXT: .functype negnan_f64 () -> (f64){{$}} 199; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, -nan{{$}} 200; CHECK-NEXT: return $pop[[NUM]]{{$}} 201define double @negnan_f64() { 202 ret double 0xFFF8000000000000 203} 204 205; CHECK-LABEL: inf_f64: 206; CHECK-NEXT: .functype inf_f64 () -> (f64){{$}} 207; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, infinity{{$}} 208; CHECK-NEXT: return $pop[[NUM]]{{$}} 209define double @inf_f64() { 210 ret double 0x7FF0000000000000 211} 212 213; CHECK-LABEL: neginf_f64: 214; CHECK-NEXT: .functype neginf_f64 () -> (f64){{$}} 215; CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, -infinity{{$}} 216; CHECK-NEXT: return $pop[[NUM]]{{$}} 217define double @neginf_f64() { 218 ret double 0xFFF0000000000000 219} 220 221;; Custom NaN playloads are currently not always preserved because of the use of 222;; native doubles in the MC layer. TODO: fix this problem or decide we don't 223;; care about preserving NaN payloads. 224 225; XXX-CHECK-LABEL: custom_nan_f64: 226; XXX-CHECK-NEXT: .functype custom_nan_f64 () -> (f64){{$}} 227; XXX-CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, -nan:0xabcdef0123456{{$}} 228; XXX-CHECK-NEXT: return $pop[[NUM]]{{$}} 229; define double @custom_nan_f64() { 230; ret double 0xFFFABCDEF0123456 231; } 232 233; XXX-CHECK-LABEL: custom_nans_f64: 234; XXX-CHECK-NEXT: .functype custom_nans_f64 () -> (f64){{$}} 235; XXX-CHECK-NEXT: f64.const $push[[NUM:[0-9]+]]=, -nan:0x2bcdef0123456{{$}} 236; XXX-CHECK-NEXT: return $pop[[NUM]]{{$}} 237; define double @custom_nans_f64() { 238; ret double 0xFFF2BCDEF0123456 239; } 240