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