| OLD | NEW |
| 1 ; This tries to be a comprehensive test of f32 and f64 operations. | 1 ; This tries to be a comprehensive test of f32 and f64 operations. |
| 2 ; The CHECK lines are only checking for basic instruction patterns | 2 ; The CHECK lines are only checking for basic instruction patterns |
| 3 ; that should be present regardless of the optimization level, so | 3 ; that should be present regardless of the optimization level, so |
| 4 ; there are no special OPTM1 match lines. | 4 ; there are no special OPTM1 match lines. |
| 5 | 5 |
| 6 ; RUN: %llvm2ice -O2 --verbose none %s | FileCheck %s | 6 ; RUN: %llvm2ice -O2 --verbose none %s | FileCheck %s |
| 7 ; RUN: %llvm2ice -Om1 --verbose none %s | FileCheck %s | 7 ; RUN: %llvm2ice -Om1 --verbose none %s | FileCheck %s |
| 8 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s | 8 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s |
| 9 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s | 9 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s |
| 10 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ | 10 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ |
| 11 ; RUN: | FileCheck --check-prefix=DUMP %s | 11 ; RUN: | FileCheck --check-prefix=DUMP %s |
| 12 | 12 |
| 13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
| 15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
| 16 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 16 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
| 17 | 17 |
| 18 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { | 18 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { |
| 19 entry: | 19 entry: |
| 20 ret i32 %b | 20 ret i32 %b |
| 21 } | 21 } |
| 22 ; CHECK: doubleArgs: | 22 ; CHECK-LABEL: doubleArgs |
| 23 ; CHECK: mov eax, dword ptr [esp+12] | 23 ; CHECK: mov eax, dword ptr [esp+12] |
| 24 ; CHECK-NEXT: ret | 24 ; CHECK-NEXT: ret |
| 25 | 25 |
| 26 define internal i32 @floatArgs(float %a, i32 %b, float %c) { | 26 define internal i32 @floatArgs(float %a, i32 %b, float %c) { |
| 27 entry: | 27 entry: |
| 28 ret i32 %b | 28 ret i32 %b |
| 29 } | 29 } |
| 30 ; CHECK: floatArgs: | 30 ; CHECK-LABEL: floatArgs |
| 31 ; CHECK: mov eax, dword ptr [esp+8] | 31 ; CHECK: mov eax, dword ptr [esp+8] |
| 32 ; CHECK-NEXT: ret | 32 ; CHECK-NEXT: ret |
| 33 | 33 |
| 34 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { | 34 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { |
| 35 entry: | 35 entry: |
| 36 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) | 36 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) |
| 37 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) | 37 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) |
| 38 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) | 38 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) |
| 39 %add = add i32 %call1, %call | 39 %add = add i32 %call1, %call |
| 40 %add3 = add i32 %add, %call2 | 40 %add3 = add i32 %add, %call2 |
| 41 ret i32 %add3 | 41 ret i32 %add3 |
| 42 } | 42 } |
| 43 ; CHECK: passFpArgs: | 43 ; CHECK-LABEL: passFpArgs |
| 44 ; CHECK: push 123 | 44 ; CHECK: push 123 |
| 45 ; CHECK: call ignoreFpArgsNoInline | 45 ; CHECK: call ignoreFpArgsNoInline |
| 46 ; CHECK: push 123 | 46 ; CHECK: push 123 |
| 47 ; CHECK: call ignoreFpArgsNoInline | 47 ; CHECK: call ignoreFpArgsNoInline |
| 48 ; CHECK: push 123 | 48 ; CHECK: push 123 |
| 49 ; CHECK: call ignoreFpArgsNoInline | 49 ; CHECK: call ignoreFpArgsNoInline |
| 50 | 50 |
| 51 declare i32 @ignoreFpArgsNoInline(float, i32, double) | 51 declare i32 @ignoreFpArgsNoInline(float, i32, double) |
| 52 | 52 |
| 53 define internal i32 @passFpConstArg(float %a, double %b) { | 53 define internal i32 @passFpConstArg(float %a, double %b) { |
| 54 entry: | 54 entry: |
| 55 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) | 55 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) |
| 56 ret i32 %call | 56 ret i32 %call |
| 57 } | 57 } |
| 58 ; CHECK: passFpConstArg: | 58 ; CHECK-LABEL: passFpConstArg |
| 59 ; CHECK: push 123 | 59 ; CHECK: push 123 |
| 60 ; CHECK: call ignoreFpArgsNoInline | 60 ; CHECK: call ignoreFpArgsNoInline |
| 61 | 61 |
| 62 define internal i32 @passFp32ConstArg(float %a) { | 62 define internal i32 @passFp32ConstArg(float %a) { |
| 63 entry: | 63 entry: |
| 64 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) | 64 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) |
| 65 ret i32 %call | 65 ret i32 %call |
| 66 } | 66 } |
| 67 ; CHECK: passFp32ConstArg: | 67 ; CHECK-LABEL: passFp32ConstArg |
| 68 ; CHECK: push dword | 68 ; CHECK: push dword |
| 69 ; CHECK: push 123 | 69 ; CHECK: push 123 |
| 70 ; CHECK: call ignoreFp32ArgsNoInline | 70 ; CHECK: call ignoreFp32ArgsNoInline |
| 71 | 71 |
| 72 declare i32 @ignoreFp32ArgsNoInline(float, i32, float) | 72 declare i32 @ignoreFp32ArgsNoInline(float, i32, float) |
| 73 | 73 |
| 74 define internal float @returnFloatArg(float %a) { | 74 define internal float @returnFloatArg(float %a) { |
| 75 entry: | 75 entry: |
| 76 ret float %a | 76 ret float %a |
| 77 } | 77 } |
| 78 ; CHECK: returnFloatArg: | 78 ; CHECK-LABEL: returnFloatArg |
| 79 ; CHECK: fld dword ptr [esp | 79 ; CHECK: fld dword ptr [esp |
| 80 | 80 |
| 81 define internal double @returnDoubleArg(double %a) { | 81 define internal double @returnDoubleArg(double %a) { |
| 82 entry: | 82 entry: |
| 83 ret double %a | 83 ret double %a |
| 84 } | 84 } |
| 85 ; CHECK: returnDoubleArg: | 85 ; CHECK-LABEL: returnDoubleArg |
| 86 ; CHECK: fld qword ptr [esp | 86 ; CHECK: fld qword ptr [esp |
| 87 | 87 |
| 88 define internal float @returnFloatConst() { | 88 define internal float @returnFloatConst() { |
| 89 entry: | 89 entry: |
| 90 ret float 0x3FF3AE1480000000 | 90 ret float 0x3FF3AE1480000000 |
| 91 } | 91 } |
| 92 ; CHECK: returnFloatConst: | 92 ; CHECK-LABEL: returnFloatConst |
| 93 ; CHECK: fld | 93 ; CHECK: fld |
| 94 | 94 |
| 95 define internal double @returnDoubleConst() { | 95 define internal double @returnDoubleConst() { |
| 96 entry: | 96 entry: |
| 97 ret double 1.230000e+00 | 97 ret double 1.230000e+00 |
| 98 } | 98 } |
| 99 ; CHECK: returnDoubleConst: | 99 ; CHECK-LABEL: returnDoubleConst |
| 100 ; CHECK: fld | 100 ; CHECK: fld |
| 101 | 101 |
| 102 define internal float @addFloat(float %a, float %b) { | 102 define internal float @addFloat(float %a, float %b) { |
| 103 entry: | 103 entry: |
| 104 %add = fadd float %a, %b | 104 %add = fadd float %a, %b |
| 105 ret float %add | 105 ret float %add |
| 106 } | 106 } |
| 107 ; CHECK: addFloat: | 107 ; CHECK-LABEL: addFloat |
| 108 ; CHECK: addss | 108 ; CHECK: addss |
| 109 ; CHECK: fld | 109 ; CHECK: fld |
| 110 | 110 |
| 111 define internal double @addDouble(double %a, double %b) { | 111 define internal double @addDouble(double %a, double %b) { |
| 112 entry: | 112 entry: |
| 113 %add = fadd double %a, %b | 113 %add = fadd double %a, %b |
| 114 ret double %add | 114 ret double %add |
| 115 } | 115 } |
| 116 ; CHECK: addDouble: | 116 ; CHECK-LABEL: addDouble |
| 117 ; CHECK: addsd | 117 ; CHECK: addsd |
| 118 ; CHECK: fld | 118 ; CHECK: fld |
| 119 | 119 |
| 120 define internal float @subFloat(float %a, float %b) { | 120 define internal float @subFloat(float %a, float %b) { |
| 121 entry: | 121 entry: |
| 122 %sub = fsub float %a, %b | 122 %sub = fsub float %a, %b |
| 123 ret float %sub | 123 ret float %sub |
| 124 } | 124 } |
| 125 ; CHECK: subFloat: | 125 ; CHECK-LABEL: subFloat |
| 126 ; CHECK: subss | 126 ; CHECK: subss |
| 127 ; CHECK: fld | 127 ; CHECK: fld |
| 128 | 128 |
| 129 define internal double @subDouble(double %a, double %b) { | 129 define internal double @subDouble(double %a, double %b) { |
| 130 entry: | 130 entry: |
| 131 %sub = fsub double %a, %b | 131 %sub = fsub double %a, %b |
| 132 ret double %sub | 132 ret double %sub |
| 133 } | 133 } |
| 134 ; CHECK: subDouble: | 134 ; CHECK-LABEL: subDouble |
| 135 ; CHECK: subsd | 135 ; CHECK: subsd |
| 136 ; CHECK: fld | 136 ; CHECK: fld |
| 137 | 137 |
| 138 define internal float @mulFloat(float %a, float %b) { | 138 define internal float @mulFloat(float %a, float %b) { |
| 139 entry: | 139 entry: |
| 140 %mul = fmul float %a, %b | 140 %mul = fmul float %a, %b |
| 141 ret float %mul | 141 ret float %mul |
| 142 } | 142 } |
| 143 ; CHECK: mulFloat: | 143 ; CHECK-LABEL: mulFloat |
| 144 ; CHECK: mulss | 144 ; CHECK: mulss |
| 145 ; CHECK: fld | 145 ; CHECK: fld |
| 146 | 146 |
| 147 define internal double @mulDouble(double %a, double %b) { | 147 define internal double @mulDouble(double %a, double %b) { |
| 148 entry: | 148 entry: |
| 149 %mul = fmul double %a, %b | 149 %mul = fmul double %a, %b |
| 150 ret double %mul | 150 ret double %mul |
| 151 } | 151 } |
| 152 ; CHECK: mulDouble: | 152 ; CHECK-LABEL: mulDouble |
| 153 ; CHECK: mulsd | 153 ; CHECK: mulsd |
| 154 ; CHECK: fld | 154 ; CHECK: fld |
| 155 | 155 |
| 156 define internal float @divFloat(float %a, float %b) { | 156 define internal float @divFloat(float %a, float %b) { |
| 157 entry: | 157 entry: |
| 158 %div = fdiv float %a, %b | 158 %div = fdiv float %a, %b |
| 159 ret float %div | 159 ret float %div |
| 160 } | 160 } |
| 161 ; CHECK: divFloat: | 161 ; CHECK-LABEL: divFloat |
| 162 ; CHECK: divss | 162 ; CHECK: divss |
| 163 ; CHECK: fld | 163 ; CHECK: fld |
| 164 | 164 |
| 165 define internal double @divDouble(double %a, double %b) { | 165 define internal double @divDouble(double %a, double %b) { |
| 166 entry: | 166 entry: |
| 167 %div = fdiv double %a, %b | 167 %div = fdiv double %a, %b |
| 168 ret double %div | 168 ret double %div |
| 169 } | 169 } |
| 170 ; CHECK: divDouble: | 170 ; CHECK-LABEL: divDouble |
| 171 ; CHECK: divsd | 171 ; CHECK: divsd |
| 172 ; CHECK: fld | 172 ; CHECK: fld |
| 173 | 173 |
| 174 define internal float @remFloat(float %a, float %b) { | 174 define internal float @remFloat(float %a, float %b) { |
| 175 entry: | 175 entry: |
| 176 %div = frem float %a, %b | 176 %div = frem float %a, %b |
| 177 ret float %div | 177 ret float %div |
| 178 } | 178 } |
| 179 ; CHECK: remFloat: | 179 ; CHECK-LABEL: remFloat |
| 180 ; CHECK: call fmodf | 180 ; CHECK: call fmodf |
| 181 | 181 |
| 182 define internal double @remDouble(double %a, double %b) { | 182 define internal double @remDouble(double %a, double %b) { |
| 183 entry: | 183 entry: |
| 184 %div = frem double %a, %b | 184 %div = frem double %a, %b |
| 185 ret double %div | 185 ret double %div |
| 186 } | 186 } |
| 187 ; CHECK: remDouble: | 187 ; CHECK-LABEL: remDouble |
| 188 ; CHECK: call fmod | 188 ; CHECK: call fmod |
| 189 | 189 |
| 190 define internal float @fptrunc(double %a) { | 190 define internal float @fptrunc(double %a) { |
| 191 entry: | 191 entry: |
| 192 %conv = fptrunc double %a to float | 192 %conv = fptrunc double %a to float |
| 193 ret float %conv | 193 ret float %conv |
| 194 } | 194 } |
| 195 ; CHECK: fptrunc: | 195 ; CHECK-LABEL: fptrunc |
| 196 ; CHECK: cvtsd2ss | 196 ; CHECK: cvtsd2ss |
| 197 ; CHECK: fld | 197 ; CHECK: fld |
| 198 | 198 |
| 199 define internal double @fpext(float %a) { | 199 define internal double @fpext(float %a) { |
| 200 entry: | 200 entry: |
| 201 %conv = fpext float %a to double | 201 %conv = fpext float %a to double |
| 202 ret double %conv | 202 ret double %conv |
| 203 } | 203 } |
| 204 ; CHECK: fpext: | 204 ; CHECK-LABEL: fpext |
| 205 ; CHECK: cvtss2sd | 205 ; CHECK: cvtss2sd |
| 206 ; CHECK: fld | 206 ; CHECK: fld |
| 207 | 207 |
| 208 define internal i64 @doubleToSigned64(double %a) { | 208 define internal i64 @doubleToSigned64(double %a) { |
| 209 entry: | 209 entry: |
| 210 %conv = fptosi double %a to i64 | 210 %conv = fptosi double %a to i64 |
| 211 ret i64 %conv | 211 ret i64 %conv |
| 212 } | 212 } |
| 213 ; CHECK: doubleToSigned64: | 213 ; CHECK-LABEL: doubleToSigned64 |
| 214 ; CHECK: call cvtdtosi64 | 214 ; CHECK: call cvtdtosi64 |
| 215 | 215 |
| 216 define internal i64 @floatToSigned64(float %a) { | 216 define internal i64 @floatToSigned64(float %a) { |
| 217 entry: | 217 entry: |
| 218 %conv = fptosi float %a to i64 | 218 %conv = fptosi float %a to i64 |
| 219 ret i64 %conv | 219 ret i64 %conv |
| 220 } | 220 } |
| 221 ; CHECK: floatToSigned64: | 221 ; CHECK-LABEL: floatToSigned64 |
| 222 ; CHECK: call cvtftosi64 | 222 ; CHECK: call cvtftosi64 |
| 223 | 223 |
| 224 define internal i64 @doubleToUnsigned64(double %a) { | 224 define internal i64 @doubleToUnsigned64(double %a) { |
| 225 entry: | 225 entry: |
| 226 %conv = fptoui double %a to i64 | 226 %conv = fptoui double %a to i64 |
| 227 ret i64 %conv | 227 ret i64 %conv |
| 228 } | 228 } |
| 229 ; CHECK: doubleToUnsigned64: | 229 ; CHECK-LABEL: doubleToUnsigned64 |
| 230 ; CHECK: call cvtdtoui64 | 230 ; CHECK: call cvtdtoui64 |
| 231 | 231 |
| 232 define internal i64 @floatToUnsigned64(float %a) { | 232 define internal i64 @floatToUnsigned64(float %a) { |
| 233 entry: | 233 entry: |
| 234 %conv = fptoui float %a to i64 | 234 %conv = fptoui float %a to i64 |
| 235 ret i64 %conv | 235 ret i64 %conv |
| 236 } | 236 } |
| 237 ; CHECK: floatToUnsigned64: | 237 ; CHECK-LABEL: floatToUnsigned64 |
| 238 ; CHECK: call cvtftoui64 | 238 ; CHECK: call cvtftoui64 |
| 239 | 239 |
| 240 define internal i32 @doubleToSigned32(double %a) { | 240 define internal i32 @doubleToSigned32(double %a) { |
| 241 entry: | 241 entry: |
| 242 %conv = fptosi double %a to i32 | 242 %conv = fptosi double %a to i32 |
| 243 ret i32 %conv | 243 ret i32 %conv |
| 244 } | 244 } |
| 245 ; CHECK: doubleToSigned32: | 245 ; CHECK-LABEL: doubleToSigned32 |
| 246 ; CHECK: cvtsd2si | 246 ; CHECK: cvtsd2si |
| 247 | 247 |
| 248 define internal i32 @floatToSigned32(float %a) { | 248 define internal i32 @floatToSigned32(float %a) { |
| 249 entry: | 249 entry: |
| 250 %conv = fptosi float %a to i32 | 250 %conv = fptosi float %a to i32 |
| 251 ret i32 %conv | 251 ret i32 %conv |
| 252 } | 252 } |
| 253 ; CHECK: floatToSigned32: | 253 ; CHECK-LABEL: floatToSigned32 |
| 254 ; CHECK: cvtss2si | 254 ; CHECK: cvtss2si |
| 255 | 255 |
| 256 define internal i32 @doubleToUnsigned32(double %a) { | 256 define internal i32 @doubleToUnsigned32(double %a) { |
| 257 entry: | 257 entry: |
| 258 %conv = fptoui double %a to i32 | 258 %conv = fptoui double %a to i32 |
| 259 ret i32 %conv | 259 ret i32 %conv |
| 260 } | 260 } |
| 261 ; CHECK: doubleToUnsigned32: | 261 ; CHECK-LABEL: doubleToUnsigned32 |
| 262 ; CHECK: call cvtdtoui32 | 262 ; CHECK: call cvtdtoui32 |
| 263 | 263 |
| 264 define internal i32 @floatToUnsigned32(float %a) { | 264 define internal i32 @floatToUnsigned32(float %a) { |
| 265 entry: | 265 entry: |
| 266 %conv = fptoui float %a to i32 | 266 %conv = fptoui float %a to i32 |
| 267 ret i32 %conv | 267 ret i32 %conv |
| 268 } | 268 } |
| 269 ; CHECK: floatToUnsigned32: | 269 ; CHECK-LABEL: floatToUnsigned32 |
| 270 ; CHECK: call cvtftoui32 | 270 ; CHECK: call cvtftoui32 |
| 271 | 271 |
| 272 define internal i32 @doubleToSigned16(double %a) { | 272 define internal i32 @doubleToSigned16(double %a) { |
| 273 entry: | 273 entry: |
| 274 %conv = fptosi double %a to i16 | 274 %conv = fptosi double %a to i16 |
| 275 %conv.ret_ext = sext i16 %conv to i32 | 275 %conv.ret_ext = sext i16 %conv to i32 |
| 276 ret i32 %conv.ret_ext | 276 ret i32 %conv.ret_ext |
| 277 } | 277 } |
| 278 ; CHECK: doubleToSigned16: | 278 ; CHECK-LABEL: doubleToSigned16 |
| 279 ; CHECK: cvtsd2si | 279 ; CHECK: cvtsd2si |
| 280 ; CHECK: movsx | 280 ; CHECK: movsx |
| 281 | 281 |
| 282 define internal i32 @floatToSigned16(float %a) { | 282 define internal i32 @floatToSigned16(float %a) { |
| 283 entry: | 283 entry: |
| 284 %conv = fptosi float %a to i16 | 284 %conv = fptosi float %a to i16 |
| 285 %conv.ret_ext = sext i16 %conv to i32 | 285 %conv.ret_ext = sext i16 %conv to i32 |
| 286 ret i32 %conv.ret_ext | 286 ret i32 %conv.ret_ext |
| 287 } | 287 } |
| 288 ; CHECK: floatToSigned16: | 288 ; CHECK-LABEL: floatToSigned16 |
| 289 ; CHECK: cvtss2si | 289 ; CHECK: cvtss2si |
| 290 ; CHECK: movsx | 290 ; CHECK: movsx |
| 291 | 291 |
| 292 define internal i32 @doubleToUnsigned16(double %a) { | 292 define internal i32 @doubleToUnsigned16(double %a) { |
| 293 entry: | 293 entry: |
| 294 %conv = fptoui double %a to i16 | 294 %conv = fptoui double %a to i16 |
| 295 %conv.ret_ext = zext i16 %conv to i32 | 295 %conv.ret_ext = zext i16 %conv to i32 |
| 296 ret i32 %conv.ret_ext | 296 ret i32 %conv.ret_ext |
| 297 } | 297 } |
| 298 ; CHECK: doubleToUnsigned16: | 298 ; CHECK-LABEL: doubleToUnsigned16 |
| 299 ; CHECK: cvtsd2si | 299 ; CHECK: cvtsd2si |
| 300 ; CHECK: movzx | 300 ; CHECK: movzx |
| 301 | 301 |
| 302 define internal i32 @floatToUnsigned16(float %a) { | 302 define internal i32 @floatToUnsigned16(float %a) { |
| 303 entry: | 303 entry: |
| 304 %conv = fptoui float %a to i16 | 304 %conv = fptoui float %a to i16 |
| 305 %conv.ret_ext = zext i16 %conv to i32 | 305 %conv.ret_ext = zext i16 %conv to i32 |
| 306 ret i32 %conv.ret_ext | 306 ret i32 %conv.ret_ext |
| 307 } | 307 } |
| 308 ; CHECK: floatToUnsigned16: | 308 ; CHECK-LABEL: floatToUnsigned16 |
| 309 ; CHECK: cvtss2si | 309 ; CHECK: cvtss2si |
| 310 ; CHECK: movzx | 310 ; CHECK: movzx |
| 311 | 311 |
| 312 define internal i32 @doubleToSigned8(double %a) { | 312 define internal i32 @doubleToSigned8(double %a) { |
| 313 entry: | 313 entry: |
| 314 %conv = fptosi double %a to i8 | 314 %conv = fptosi double %a to i8 |
| 315 %conv.ret_ext = sext i8 %conv to i32 | 315 %conv.ret_ext = sext i8 %conv to i32 |
| 316 ret i32 %conv.ret_ext | 316 ret i32 %conv.ret_ext |
| 317 } | 317 } |
| 318 ; CHECK: doubleToSigned8: | 318 ; CHECK-LABEL: doubleToSigned8 |
| 319 ; CHECK: cvtsd2si | 319 ; CHECK: cvtsd2si |
| 320 ; CHECK: movsx | 320 ; CHECK: movsx |
| 321 | 321 |
| 322 define internal i32 @floatToSigned8(float %a) { | 322 define internal i32 @floatToSigned8(float %a) { |
| 323 entry: | 323 entry: |
| 324 %conv = fptosi float %a to i8 | 324 %conv = fptosi float %a to i8 |
| 325 %conv.ret_ext = sext i8 %conv to i32 | 325 %conv.ret_ext = sext i8 %conv to i32 |
| 326 ret i32 %conv.ret_ext | 326 ret i32 %conv.ret_ext |
| 327 } | 327 } |
| 328 ; CHECK: floatToSigned8: | 328 ; CHECK-LABEL: floatToSigned8 |
| 329 ; CHECK: cvtss2si | 329 ; CHECK: cvtss2si |
| 330 ; CHECK: movsx | 330 ; CHECK: movsx |
| 331 | 331 |
| 332 define internal i32 @doubleToUnsigned8(double %a) { | 332 define internal i32 @doubleToUnsigned8(double %a) { |
| 333 entry: | 333 entry: |
| 334 %conv = fptoui double %a to i8 | 334 %conv = fptoui double %a to i8 |
| 335 %conv.ret_ext = zext i8 %conv to i32 | 335 %conv.ret_ext = zext i8 %conv to i32 |
| 336 ret i32 %conv.ret_ext | 336 ret i32 %conv.ret_ext |
| 337 } | 337 } |
| 338 ; CHECK: doubleToUnsigned8: | 338 ; CHECK-LABEL: doubleToUnsigned8 |
| 339 ; CHECK: cvtsd2si | 339 ; CHECK: cvtsd2si |
| 340 ; CHECK: movzx | 340 ; CHECK: movzx |
| 341 | 341 |
| 342 define internal i32 @floatToUnsigned8(float %a) { | 342 define internal i32 @floatToUnsigned8(float %a) { |
| 343 entry: | 343 entry: |
| 344 %conv = fptoui float %a to i8 | 344 %conv = fptoui float %a to i8 |
| 345 %conv.ret_ext = zext i8 %conv to i32 | 345 %conv.ret_ext = zext i8 %conv to i32 |
| 346 ret i32 %conv.ret_ext | 346 ret i32 %conv.ret_ext |
| 347 } | 347 } |
| 348 ; CHECK: floatToUnsigned8: | 348 ; CHECK-LABEL: floatToUnsigned8 |
| 349 ; CHECK: cvtss2si | 349 ; CHECK: cvtss2si |
| 350 ; CHECK: movzx | 350 ; CHECK: movzx |
| 351 | 351 |
| 352 define internal i32 @doubleToUnsigned1(double %a) { | 352 define internal i32 @doubleToUnsigned1(double %a) { |
| 353 entry: | 353 entry: |
| 354 %tobool = fptoui double %a to i1 | 354 %tobool = fptoui double %a to i1 |
| 355 %tobool.ret_ext = zext i1 %tobool to i32 | 355 %tobool.ret_ext = zext i1 %tobool to i32 |
| 356 ret i32 %tobool.ret_ext | 356 ret i32 %tobool.ret_ext |
| 357 } | 357 } |
| 358 ; CHECK: doubleToUnsigned1: | 358 ; CHECK-LABEL: doubleToUnsigned1 |
| 359 ; CHECK: cvtsd2si | 359 ; CHECK: cvtsd2si |
| 360 ; CHECK: and eax, 1 | 360 ; CHECK: and eax, 1 |
| 361 | 361 |
| 362 define internal i32 @floatToUnsigned1(float %a) { | 362 define internal i32 @floatToUnsigned1(float %a) { |
| 363 entry: | 363 entry: |
| 364 %tobool = fptoui float %a to i1 | 364 %tobool = fptoui float %a to i1 |
| 365 %tobool.ret_ext = zext i1 %tobool to i32 | 365 %tobool.ret_ext = zext i1 %tobool to i32 |
| 366 ret i32 %tobool.ret_ext | 366 ret i32 %tobool.ret_ext |
| 367 } | 367 } |
| 368 ; CHECK: floatToUnsigned1: | 368 ; CHECK-LABEL: floatToUnsigned1 |
| 369 ; CHECK: cvtss2si | 369 ; CHECK: cvtss2si |
| 370 ; CHECK: and eax, 1 | 370 ; CHECK: and eax, 1 |
| 371 | 371 |
| 372 define internal double @signed64ToDouble(i64 %a) { | 372 define internal double @signed64ToDouble(i64 %a) { |
| 373 entry: | 373 entry: |
| 374 %conv = sitofp i64 %a to double | 374 %conv = sitofp i64 %a to double |
| 375 ret double %conv | 375 ret double %conv |
| 376 } | 376 } |
| 377 ; CHECK: signed64ToDouble: | 377 ; CHECK-LABEL: signed64ToDouble |
| 378 ; CHECK: call cvtsi64tod | 378 ; CHECK: call cvtsi64tod |
| 379 ; CHECK: fstp | 379 ; CHECK: fstp |
| 380 | 380 |
| 381 define internal float @signed64ToFloat(i64 %a) { | 381 define internal float @signed64ToFloat(i64 %a) { |
| 382 entry: | 382 entry: |
| 383 %conv = sitofp i64 %a to float | 383 %conv = sitofp i64 %a to float |
| 384 ret float %conv | 384 ret float %conv |
| 385 } | 385 } |
| 386 ; CHECK: signed64ToFloat: | 386 ; CHECK-LABEL: signed64ToFloat |
| 387 ; CHECK: call cvtsi64tof | 387 ; CHECK: call cvtsi64tof |
| 388 ; CHECK: fstp | 388 ; CHECK: fstp |
| 389 | 389 |
| 390 define internal double @unsigned64ToDouble(i64 %a) { | 390 define internal double @unsigned64ToDouble(i64 %a) { |
| 391 entry: | 391 entry: |
| 392 %conv = uitofp i64 %a to double | 392 %conv = uitofp i64 %a to double |
| 393 ret double %conv | 393 ret double %conv |
| 394 } | 394 } |
| 395 ; CHECK: unsigned64ToDouble: | 395 ; CHECK-LABEL: unsigned64ToDouble |
| 396 ; CHECK: call cvtui64tod | 396 ; CHECK: call cvtui64tod |
| 397 ; CHECK: fstp | 397 ; CHECK: fstp |
| 398 | 398 |
| 399 define internal float @unsigned64ToFloat(i64 %a) { | 399 define internal float @unsigned64ToFloat(i64 %a) { |
| 400 entry: | 400 entry: |
| 401 %conv = uitofp i64 %a to float | 401 %conv = uitofp i64 %a to float |
| 402 ret float %conv | 402 ret float %conv |
| 403 } | 403 } |
| 404 ; CHECK: unsigned64ToFloat: | 404 ; CHECK-LABEL: unsigned64ToFloat |
| 405 ; CHECK: call cvtui64tof | 405 ; CHECK: call cvtui64tof |
| 406 ; CHECK: fstp | 406 ; CHECK: fstp |
| 407 | 407 |
| 408 define internal double @signed32ToDouble(i32 %a) { | 408 define internal double @signed32ToDouble(i32 %a) { |
| 409 entry: | 409 entry: |
| 410 %conv = sitofp i32 %a to double | 410 %conv = sitofp i32 %a to double |
| 411 ret double %conv | 411 ret double %conv |
| 412 } | 412 } |
| 413 ; CHECK: signed32ToDouble: | 413 ; CHECK-LABEL: signed32ToDouble |
| 414 ; CHECK: cvtsi2sd | 414 ; CHECK: cvtsi2sd |
| 415 ; CHECK: fld | 415 ; CHECK: fld |
| 416 | 416 |
| 417 define internal float @signed32ToFloat(i32 %a) { | 417 define internal float @signed32ToFloat(i32 %a) { |
| 418 entry: | 418 entry: |
| 419 %conv = sitofp i32 %a to float | 419 %conv = sitofp i32 %a to float |
| 420 ret float %conv | 420 ret float %conv |
| 421 } | 421 } |
| 422 ; CHECK: signed32ToFloat: | 422 ; CHECK-LABEL: signed32ToFloat |
| 423 ; CHECK: cvtsi2ss | 423 ; CHECK: cvtsi2ss |
| 424 ; CHECK: fld | 424 ; CHECK: fld |
| 425 | 425 |
| 426 define internal double @unsigned32ToDouble(i32 %a) { | 426 define internal double @unsigned32ToDouble(i32 %a) { |
| 427 entry: | 427 entry: |
| 428 %conv = uitofp i32 %a to double | 428 %conv = uitofp i32 %a to double |
| 429 ret double %conv | 429 ret double %conv |
| 430 } | 430 } |
| 431 ; CHECK: unsigned32ToDouble: | 431 ; CHECK-LABEL: unsigned32ToDouble |
| 432 ; CHECK: call cvtui32tod | 432 ; CHECK: call cvtui32tod |
| 433 ; CHECK: fstp | 433 ; CHECK: fstp |
| 434 | 434 |
| 435 define internal float @unsigned32ToFloat(i32 %a) { | 435 define internal float @unsigned32ToFloat(i32 %a) { |
| 436 entry: | 436 entry: |
| 437 %conv = uitofp i32 %a to float | 437 %conv = uitofp i32 %a to float |
| 438 ret float %conv | 438 ret float %conv |
| 439 } | 439 } |
| 440 ; CHECK: unsigned32ToFloat: | 440 ; CHECK-LABEL: unsigned32ToFloat |
| 441 ; CHECK: call cvtui32tof | 441 ; CHECK: call cvtui32tof |
| 442 ; CHECK: fstp | 442 ; CHECK: fstp |
| 443 | 443 |
| 444 define internal double @signed16ToDouble(i32 %a) { | 444 define internal double @signed16ToDouble(i32 %a) { |
| 445 entry: | 445 entry: |
| 446 %a.arg_trunc = trunc i32 %a to i16 | 446 %a.arg_trunc = trunc i32 %a to i16 |
| 447 %conv = sitofp i16 %a.arg_trunc to double | 447 %conv = sitofp i16 %a.arg_trunc to double |
| 448 ret double %conv | 448 ret double %conv |
| 449 } | 449 } |
| 450 ; CHECK: signed16ToDouble: | 450 ; CHECK-LABEL: signed16ToDouble |
| 451 ; CHECK: cvtsi2sd | 451 ; CHECK: cvtsi2sd |
| 452 ; CHECK: fld | 452 ; CHECK: fld |
| 453 | 453 |
| 454 define internal float @signed16ToFloat(i32 %a) { | 454 define internal float @signed16ToFloat(i32 %a) { |
| 455 entry: | 455 entry: |
| 456 %a.arg_trunc = trunc i32 %a to i16 | 456 %a.arg_trunc = trunc i32 %a to i16 |
| 457 %conv = sitofp i16 %a.arg_trunc to float | 457 %conv = sitofp i16 %a.arg_trunc to float |
| 458 ret float %conv | 458 ret float %conv |
| 459 } | 459 } |
| 460 ; CHECK: signed16ToFloat: | 460 ; CHECK-LABEL: signed16ToFloat |
| 461 ; CHECK: cvtsi2ss | 461 ; CHECK: cvtsi2ss |
| 462 ; CHECK: fld | 462 ; CHECK: fld |
| 463 | 463 |
| 464 define internal double @unsigned16ToDouble(i32 %a) { | 464 define internal double @unsigned16ToDouble(i32 %a) { |
| 465 entry: | 465 entry: |
| 466 %a.arg_trunc = trunc i32 %a to i16 | 466 %a.arg_trunc = trunc i32 %a to i16 |
| 467 %conv = uitofp i16 %a.arg_trunc to double | 467 %conv = uitofp i16 %a.arg_trunc to double |
| 468 ret double %conv | 468 ret double %conv |
| 469 } | 469 } |
| 470 ; CHECK: unsigned16ToDouble: | 470 ; CHECK-LABEL: unsigned16ToDouble |
| 471 ; CHECK: cvtsi2sd | 471 ; CHECK: cvtsi2sd |
| 472 ; CHECK: fld | 472 ; CHECK: fld |
| 473 | 473 |
| 474 define internal float @unsigned16ToFloat(i32 %a) { | 474 define internal float @unsigned16ToFloat(i32 %a) { |
| 475 entry: | 475 entry: |
| 476 %a.arg_trunc = trunc i32 %a to i16 | 476 %a.arg_trunc = trunc i32 %a to i16 |
| 477 %conv = uitofp i16 %a.arg_trunc to float | 477 %conv = uitofp i16 %a.arg_trunc to float |
| 478 ret float %conv | 478 ret float %conv |
| 479 } | 479 } |
| 480 ; CHECK: unsigned16ToFloat: | 480 ; CHECK-LABEL: unsigned16ToFloat |
| 481 ; CHECK: cvtsi2ss | 481 ; CHECK: cvtsi2ss |
| 482 ; CHECK: fld | 482 ; CHECK: fld |
| 483 | 483 |
| 484 define internal double @signed8ToDouble(i32 %a) { | 484 define internal double @signed8ToDouble(i32 %a) { |
| 485 entry: | 485 entry: |
| 486 %a.arg_trunc = trunc i32 %a to i8 | 486 %a.arg_trunc = trunc i32 %a to i8 |
| 487 %conv = sitofp i8 %a.arg_trunc to double | 487 %conv = sitofp i8 %a.arg_trunc to double |
| 488 ret double %conv | 488 ret double %conv |
| 489 } | 489 } |
| 490 ; CHECK: signed8ToDouble: | 490 ; CHECK-LABEL: signed8ToDouble |
| 491 ; CHECK: cvtsi2sd | 491 ; CHECK: cvtsi2sd |
| 492 ; CHECK: fld | 492 ; CHECK: fld |
| 493 | 493 |
| 494 define internal float @signed8ToFloat(i32 %a) { | 494 define internal float @signed8ToFloat(i32 %a) { |
| 495 entry: | 495 entry: |
| 496 %a.arg_trunc = trunc i32 %a to i8 | 496 %a.arg_trunc = trunc i32 %a to i8 |
| 497 %conv = sitofp i8 %a.arg_trunc to float | 497 %conv = sitofp i8 %a.arg_trunc to float |
| 498 ret float %conv | 498 ret float %conv |
| 499 } | 499 } |
| 500 ; CHECK: signed8ToFloat: | 500 ; CHECK-LABEL: signed8ToFloat |
| 501 ; CHECK: cvtsi2ss | 501 ; CHECK: cvtsi2ss |
| 502 ; CHECK: fld | 502 ; CHECK: fld |
| 503 | 503 |
| 504 define internal double @unsigned8ToDouble(i32 %a) { | 504 define internal double @unsigned8ToDouble(i32 %a) { |
| 505 entry: | 505 entry: |
| 506 %a.arg_trunc = trunc i32 %a to i8 | 506 %a.arg_trunc = trunc i32 %a to i8 |
| 507 %conv = uitofp i8 %a.arg_trunc to double | 507 %conv = uitofp i8 %a.arg_trunc to double |
| 508 ret double %conv | 508 ret double %conv |
| 509 } | 509 } |
| 510 ; CHECK: unsigned8ToDouble: | 510 ; CHECK-LABEL: unsigned8ToDouble |
| 511 ; CHECK: cvtsi2sd | 511 ; CHECK: cvtsi2sd |
| 512 ; CHECK: fld | 512 ; CHECK: fld |
| 513 | 513 |
| 514 define internal float @unsigned8ToFloat(i32 %a) { | 514 define internal float @unsigned8ToFloat(i32 %a) { |
| 515 entry: | 515 entry: |
| 516 %a.arg_trunc = trunc i32 %a to i8 | 516 %a.arg_trunc = trunc i32 %a to i8 |
| 517 %conv = uitofp i8 %a.arg_trunc to float | 517 %conv = uitofp i8 %a.arg_trunc to float |
| 518 ret float %conv | 518 ret float %conv |
| 519 } | 519 } |
| 520 ; CHECK: unsigned8ToFloat: | 520 ; CHECK-LABEL: unsigned8ToFloat |
| 521 ; CHECK: cvtsi2ss | 521 ; CHECK: cvtsi2ss |
| 522 ; CHECK: fld | 522 ; CHECK: fld |
| 523 | 523 |
| 524 define internal double @unsigned1ToDouble(i32 %a) { | 524 define internal double @unsigned1ToDouble(i32 %a) { |
| 525 entry: | 525 entry: |
| 526 %a.arg_trunc = trunc i32 %a to i1 | 526 %a.arg_trunc = trunc i32 %a to i1 |
| 527 %conv = uitofp i1 %a.arg_trunc to double | 527 %conv = uitofp i1 %a.arg_trunc to double |
| 528 ret double %conv | 528 ret double %conv |
| 529 } | 529 } |
| 530 ; CHECK: unsigned1ToDouble: | 530 ; CHECK-LABEL: unsigned1ToDouble |
| 531 ; CHECK: cvtsi2sd | 531 ; CHECK: cvtsi2sd |
| 532 ; CHECK: fld | 532 ; CHECK: fld |
| 533 | 533 |
| 534 define internal float @unsigned1ToFloat(i32 %a) { | 534 define internal float @unsigned1ToFloat(i32 %a) { |
| 535 entry: | 535 entry: |
| 536 %a.arg_trunc = trunc i32 %a to i1 | 536 %a.arg_trunc = trunc i32 %a to i1 |
| 537 %conv = uitofp i1 %a.arg_trunc to float | 537 %conv = uitofp i1 %a.arg_trunc to float |
| 538 ret float %conv | 538 ret float %conv |
| 539 } | 539 } |
| 540 ; CHECK: unsigned1ToFloat: | 540 ; CHECK-LABEL: unsigned1ToFloat |
| 541 ; CHECK: cvtsi2ss | 541 ; CHECK: cvtsi2ss |
| 542 ; CHECK: fld | 542 ; CHECK: fld |
| 543 | 543 |
| 544 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { | 544 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { |
| 545 entry: | 545 entry: |
| 546 %cmp = fcmp oeq float %a, %b | 546 %cmp = fcmp oeq float %a, %b |
| 547 br i1 %cmp, label %if.then, label %if.end | 547 br i1 %cmp, label %if.then, label %if.end |
| 548 | 548 |
| 549 if.then: ; preds = %entry | 549 if.then: ; preds = %entry |
| 550 call void @func() | 550 call void @func() |
| 551 br label %if.end | 551 br label %if.end |
| 552 | 552 |
| 553 if.end: ; preds = %if.then, %entry | 553 if.end: ; preds = %if.then, %entry |
| 554 %cmp1 = fcmp oeq double %c, %d | 554 %cmp1 = fcmp oeq double %c, %d |
| 555 br i1 %cmp1, label %if.then2, label %if.end3 | 555 br i1 %cmp1, label %if.then2, label %if.end3 |
| 556 | 556 |
| 557 if.then2: ; preds = %if.end | 557 if.then2: ; preds = %if.end |
| 558 call void @func() | 558 call void @func() |
| 559 br label %if.end3 | 559 br label %if.end3 |
| 560 | 560 |
| 561 if.end3: ; preds = %if.then2, %if.end | 561 if.end3: ; preds = %if.then2, %if.end |
| 562 ret void | 562 ret void |
| 563 } | 563 } |
| 564 ; CHECK: fcmpEq: | 564 ; CHECK-LABEL: fcmpEq |
| 565 ; CHECK: ucomiss | 565 ; CHECK: ucomiss |
| 566 ; CHECK: jne . | 566 ; CHECK: jne . |
| 567 ; CHECK-NEXT: jp . | 567 ; CHECK-NEXT: jp . |
| 568 ; CHECK: call func | 568 ; CHECK: call func |
| 569 ; CHECK: ucomisd | 569 ; CHECK: ucomisd |
| 570 ; CHECK: jne . | 570 ; CHECK: jne . |
| 571 ; CHECK-NEXT: jp . | 571 ; CHECK-NEXT: jp . |
| 572 ; CHECK: call func | 572 ; CHECK: call func |
| 573 | 573 |
| 574 declare void @func() | 574 declare void @func() |
| (...skipping 11 matching lines...) Expand all Loading... |
| 586 %cmp1 = fcmp une double %c, %d | 586 %cmp1 = fcmp une double %c, %d |
| 587 br i1 %cmp1, label %if.then2, label %if.end3 | 587 br i1 %cmp1, label %if.then2, label %if.end3 |
| 588 | 588 |
| 589 if.then2: ; preds = %if.end | 589 if.then2: ; preds = %if.end |
| 590 call void @func() | 590 call void @func() |
| 591 br label %if.end3 | 591 br label %if.end3 |
| 592 | 592 |
| 593 if.end3: ; preds = %if.then2, %if.end | 593 if.end3: ; preds = %if.then2, %if.end |
| 594 ret void | 594 ret void |
| 595 } | 595 } |
| 596 ; CHECK: fcmpNe: | 596 ; CHECK-LABEL: fcmpNe |
| 597 ; CHECK: ucomiss | 597 ; CHECK: ucomiss |
| 598 ; CHECK: jne . | 598 ; CHECK: jne . |
| 599 ; CHECK-NEXT: jp . | 599 ; CHECK-NEXT: jp . |
| 600 ; CHECK: call func | 600 ; CHECK: call func |
| 601 ; CHECK: ucomisd | 601 ; CHECK: ucomisd |
| 602 ; CHECK: jne . | 602 ; CHECK: jne . |
| 603 ; CHECK-NEXT: jp . | 603 ; CHECK-NEXT: jp . |
| 604 ; CHECK: call func | 604 ; CHECK: call func |
| 605 | 605 |
| 606 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | 606 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { |
| 607 entry: | 607 entry: |
| 608 %cmp = fcmp ogt float %a, %b | 608 %cmp = fcmp ogt float %a, %b |
| 609 br i1 %cmp, label %if.then, label %if.end | 609 br i1 %cmp, label %if.then, label %if.end |
| 610 | 610 |
| 611 if.then: ; preds = %entry | 611 if.then: ; preds = %entry |
| 612 call void @func() | 612 call void @func() |
| 613 br label %if.end | 613 br label %if.end |
| 614 | 614 |
| 615 if.end: ; preds = %if.then, %entry | 615 if.end: ; preds = %if.then, %entry |
| 616 %cmp1 = fcmp ogt double %c, %d | 616 %cmp1 = fcmp ogt double %c, %d |
| 617 br i1 %cmp1, label %if.then2, label %if.end3 | 617 br i1 %cmp1, label %if.then2, label %if.end3 |
| 618 | 618 |
| 619 if.then2: ; preds = %if.end | 619 if.then2: ; preds = %if.end |
| 620 call void @func() | 620 call void @func() |
| 621 br label %if.end3 | 621 br label %if.end3 |
| 622 | 622 |
| 623 if.end3: ; preds = %if.then2, %if.end | 623 if.end3: ; preds = %if.then2, %if.end |
| 624 ret void | 624 ret void |
| 625 } | 625 } |
| 626 ; CHECK: fcmpGt: | 626 ; CHECK-LABEL: fcmpGt |
| 627 ; CHECK: ucomiss | 627 ; CHECK: ucomiss |
| 628 ; CHECK: ja . | 628 ; CHECK: ja . |
| 629 ; CHECK: call func | 629 ; CHECK: call func |
| 630 ; CHECK: ucomisd | 630 ; CHECK: ucomisd |
| 631 ; CHECK: ja . | 631 ; CHECK: ja . |
| 632 ; CHECK: call func | 632 ; CHECK: call func |
| 633 | 633 |
| 634 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | 634 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { |
| 635 entry: | 635 entry: |
| 636 %cmp = fcmp ult float %a, %b | 636 %cmp = fcmp ult float %a, %b |
| 637 br i1 %cmp, label %if.end, label %if.then | 637 br i1 %cmp, label %if.end, label %if.then |
| 638 | 638 |
| 639 if.then: ; preds = %entry | 639 if.then: ; preds = %entry |
| 640 call void @func() | 640 call void @func() |
| 641 br label %if.end | 641 br label %if.end |
| 642 | 642 |
| 643 if.end: ; preds = %entry, %if.then | 643 if.end: ; preds = %entry, %if.then |
| 644 %cmp1 = fcmp ult double %c, %d | 644 %cmp1 = fcmp ult double %c, %d |
| 645 br i1 %cmp1, label %if.end3, label %if.then2 | 645 br i1 %cmp1, label %if.end3, label %if.then2 |
| 646 | 646 |
| 647 if.then2: ; preds = %if.end | 647 if.then2: ; preds = %if.end |
| 648 call void @func() | 648 call void @func() |
| 649 br label %if.end3 | 649 br label %if.end3 |
| 650 | 650 |
| 651 if.end3: ; preds = %if.end, %if.then2 | 651 if.end3: ; preds = %if.end, %if.then2 |
| 652 ret void | 652 ret void |
| 653 } | 653 } |
| 654 ; CHECK: fcmpGe: | 654 ; CHECK-LABEL: fcmpGe |
| 655 ; CHECK: ucomiss | 655 ; CHECK: ucomiss |
| 656 ; CHECK: jb . | 656 ; CHECK: jb . |
| 657 ; CHECK: call func | 657 ; CHECK: call func |
| 658 ; CHECK: ucomisd | 658 ; CHECK: ucomisd |
| 659 ; CHECK: jb . | 659 ; CHECK: jb . |
| 660 ; CHECK: call func | 660 ; CHECK: call func |
| 661 | 661 |
| 662 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | 662 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { |
| 663 entry: | 663 entry: |
| 664 %cmp = fcmp olt float %a, %b | 664 %cmp = fcmp olt float %a, %b |
| 665 br i1 %cmp, label %if.then, label %if.end | 665 br i1 %cmp, label %if.then, label %if.end |
| 666 | 666 |
| 667 if.then: ; preds = %entry | 667 if.then: ; preds = %entry |
| 668 call void @func() | 668 call void @func() |
| 669 br label %if.end | 669 br label %if.end |
| 670 | 670 |
| 671 if.end: ; preds = %if.then, %entry | 671 if.end: ; preds = %if.then, %entry |
| 672 %cmp1 = fcmp olt double %c, %d | 672 %cmp1 = fcmp olt double %c, %d |
| 673 br i1 %cmp1, label %if.then2, label %if.end3 | 673 br i1 %cmp1, label %if.then2, label %if.end3 |
| 674 | 674 |
| 675 if.then2: ; preds = %if.end | 675 if.then2: ; preds = %if.end |
| 676 call void @func() | 676 call void @func() |
| 677 br label %if.end3 | 677 br label %if.end3 |
| 678 | 678 |
| 679 if.end3: ; preds = %if.then2, %if.end | 679 if.end3: ; preds = %if.then2, %if.end |
| 680 ret void | 680 ret void |
| 681 } | 681 } |
| 682 ; CHECK: fcmpLt: | 682 ; CHECK-LABEL: fcmpLt |
| 683 ; CHECK: ucomiss | 683 ; CHECK: ucomiss |
| 684 ; CHECK: ja . | 684 ; CHECK: ja . |
| 685 ; CHECK: call func | 685 ; CHECK: call func |
| 686 ; CHECK: ucomisd | 686 ; CHECK: ucomisd |
| 687 ; CHECK: ja . | 687 ; CHECK: ja . |
| 688 ; CHECK: call func | 688 ; CHECK: call func |
| 689 | 689 |
| 690 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | 690 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { |
| 691 entry: | 691 entry: |
| 692 %cmp = fcmp ugt float %a, %b | 692 %cmp = fcmp ugt float %a, %b |
| 693 br i1 %cmp, label %if.end, label %if.then | 693 br i1 %cmp, label %if.end, label %if.then |
| 694 | 694 |
| 695 if.then: ; preds = %entry | 695 if.then: ; preds = %entry |
| 696 call void @func() | 696 call void @func() |
| 697 br label %if.end | 697 br label %if.end |
| 698 | 698 |
| 699 if.end: ; preds = %entry, %if.then | 699 if.end: ; preds = %entry, %if.then |
| 700 %cmp1 = fcmp ugt double %c, %d | 700 %cmp1 = fcmp ugt double %c, %d |
| 701 br i1 %cmp1, label %if.end3, label %if.then2 | 701 br i1 %cmp1, label %if.end3, label %if.then2 |
| 702 | 702 |
| 703 if.then2: ; preds = %if.end | 703 if.then2: ; preds = %if.end |
| 704 call void @func() | 704 call void @func() |
| 705 br label %if.end3 | 705 br label %if.end3 |
| 706 | 706 |
| 707 if.end3: ; preds = %if.end, %if.then2 | 707 if.end3: ; preds = %if.end, %if.then2 |
| 708 ret void | 708 ret void |
| 709 } | 709 } |
| 710 ; CHECK: fcmpLe: | 710 ; CHECK-LABEL: fcmpLe |
| 711 ; CHECK: ucomiss | 711 ; CHECK: ucomiss |
| 712 ; CHECK: jb . | 712 ; CHECK: jb . |
| 713 ; CHECK: call func | 713 ; CHECK: call func |
| 714 ; CHECK: ucomisd | 714 ; CHECK: ucomisd |
| 715 ; CHECK: jb . | 715 ; CHECK: jb . |
| 716 ; CHECK: call func | 716 ; CHECK: call func |
| 717 | 717 |
| 718 define internal i32 @fcmpFalseFloat(float %a, float %b) { | 718 define internal i32 @fcmpFalseFloat(float %a, float %b) { |
| 719 entry: | 719 entry: |
| 720 %cmp = fcmp false float %a, %b | 720 %cmp = fcmp false float %a, %b |
| 721 %cmp.ret_ext = zext i1 %cmp to i32 | 721 %cmp.ret_ext = zext i1 %cmp to i32 |
| 722 ret i32 %cmp.ret_ext | 722 ret i32 %cmp.ret_ext |
| 723 } | 723 } |
| 724 ; CHECK: fcmpFalseFloat: | 724 ; CHECK-LABEL: fcmpFalseFloat |
| 725 ; CHECK: mov {{.*}}, 0 | 725 ; CHECK: mov {{.*}}, 0 |
| 726 | 726 |
| 727 define internal i32 @fcmpFalseDouble(double %a, double %b) { | 727 define internal i32 @fcmpFalseDouble(double %a, double %b) { |
| 728 entry: | 728 entry: |
| 729 %cmp = fcmp false double %a, %b | 729 %cmp = fcmp false double %a, %b |
| 730 %cmp.ret_ext = zext i1 %cmp to i32 | 730 %cmp.ret_ext = zext i1 %cmp to i32 |
| 731 ret i32 %cmp.ret_ext | 731 ret i32 %cmp.ret_ext |
| 732 } | 732 } |
| 733 ; CHECK: fcmpFalseDouble: | 733 ; CHECK-LABEL: fcmpFalseDouble |
| 734 ; CHECK: mov {{.*}}, 0 | 734 ; CHECK: mov {{.*}}, 0 |
| 735 | 735 |
| 736 define internal i32 @fcmpOeqFloat(float %a, float %b) { | 736 define internal i32 @fcmpOeqFloat(float %a, float %b) { |
| 737 entry: | 737 entry: |
| 738 %cmp = fcmp oeq float %a, %b | 738 %cmp = fcmp oeq float %a, %b |
| 739 %cmp.ret_ext = zext i1 %cmp to i32 | 739 %cmp.ret_ext = zext i1 %cmp to i32 |
| 740 ret i32 %cmp.ret_ext | 740 ret i32 %cmp.ret_ext |
| 741 } | 741 } |
| 742 ; CHECK: fcmpOeqFloat: | 742 ; CHECK-LABEL: fcmpOeqFloat |
| 743 ; CHECK: ucomiss | 743 ; CHECK: ucomiss |
| 744 ; CHECK: jne . | 744 ; CHECK: jne . |
| 745 ; CHECK: jp . | 745 ; CHECK: jp . |
| 746 | 746 |
| 747 define internal i32 @fcmpOeqDouble(double %a, double %b) { | 747 define internal i32 @fcmpOeqDouble(double %a, double %b) { |
| 748 entry: | 748 entry: |
| 749 %cmp = fcmp oeq double %a, %b | 749 %cmp = fcmp oeq double %a, %b |
| 750 %cmp.ret_ext = zext i1 %cmp to i32 | 750 %cmp.ret_ext = zext i1 %cmp to i32 |
| 751 ret i32 %cmp.ret_ext | 751 ret i32 %cmp.ret_ext |
| 752 } | 752 } |
| 753 ; CHECK: fcmpOeqDouble: | 753 ; CHECK-LABEL: fcmpOeqDouble |
| 754 ; CHECK: ucomisd | 754 ; CHECK: ucomisd |
| 755 ; CHECK: jne . | 755 ; CHECK: jne . |
| 756 ; CHECK: jp . | 756 ; CHECK: jp . |
| 757 | 757 |
| 758 define internal i32 @fcmpOgtFloat(float %a, float %b) { | 758 define internal i32 @fcmpOgtFloat(float %a, float %b) { |
| 759 entry: | 759 entry: |
| 760 %cmp = fcmp ogt float %a, %b | 760 %cmp = fcmp ogt float %a, %b |
| 761 %cmp.ret_ext = zext i1 %cmp to i32 | 761 %cmp.ret_ext = zext i1 %cmp to i32 |
| 762 ret i32 %cmp.ret_ext | 762 ret i32 %cmp.ret_ext |
| 763 } | 763 } |
| 764 ; CHECK: fcmpOgtFloat: | 764 ; CHECK-LABEL: fcmpOgtFloat |
| 765 ; CHECK: ucomiss | 765 ; CHECK: ucomiss |
| 766 ; CHECK: ja . | 766 ; CHECK: ja . |
| 767 | 767 |
| 768 define internal i32 @fcmpOgtDouble(double %a, double %b) { | 768 define internal i32 @fcmpOgtDouble(double %a, double %b) { |
| 769 entry: | 769 entry: |
| 770 %cmp = fcmp ogt double %a, %b | 770 %cmp = fcmp ogt double %a, %b |
| 771 %cmp.ret_ext = zext i1 %cmp to i32 | 771 %cmp.ret_ext = zext i1 %cmp to i32 |
| 772 ret i32 %cmp.ret_ext | 772 ret i32 %cmp.ret_ext |
| 773 } | 773 } |
| 774 ; CHECK: fcmpOgtDouble: | 774 ; CHECK-LABEL: fcmpOgtDouble |
| 775 ; CHECK: ucomisd | 775 ; CHECK: ucomisd |
| 776 ; CHECK: ja . | 776 ; CHECK: ja . |
| 777 | 777 |
| 778 define internal i32 @fcmpOgeFloat(float %a, float %b) { | 778 define internal i32 @fcmpOgeFloat(float %a, float %b) { |
| 779 entry: | 779 entry: |
| 780 %cmp = fcmp oge float %a, %b | 780 %cmp = fcmp oge float %a, %b |
| 781 %cmp.ret_ext = zext i1 %cmp to i32 | 781 %cmp.ret_ext = zext i1 %cmp to i32 |
| 782 ret i32 %cmp.ret_ext | 782 ret i32 %cmp.ret_ext |
| 783 } | 783 } |
| 784 ; CHECK: fcmpOgeFloat: | 784 ; CHECK-LABEL: fcmpOgeFloat |
| 785 ; CHECK: ucomiss | 785 ; CHECK: ucomiss |
| 786 ; CHECK: jae . | 786 ; CHECK: jae . |
| 787 | 787 |
| 788 define internal i32 @fcmpOgeDouble(double %a, double %b) { | 788 define internal i32 @fcmpOgeDouble(double %a, double %b) { |
| 789 entry: | 789 entry: |
| 790 %cmp = fcmp oge double %a, %b | 790 %cmp = fcmp oge double %a, %b |
| 791 %cmp.ret_ext = zext i1 %cmp to i32 | 791 %cmp.ret_ext = zext i1 %cmp to i32 |
| 792 ret i32 %cmp.ret_ext | 792 ret i32 %cmp.ret_ext |
| 793 } | 793 } |
| 794 ; CHECK: fcmpOgeDouble: | 794 ; CHECK-LABEL: fcmpOgeDouble |
| 795 ; CHECK: ucomisd | 795 ; CHECK: ucomisd |
| 796 ; CHECK: jae . | 796 ; CHECK: jae . |
| 797 | 797 |
| 798 define internal i32 @fcmpOltFloat(float %a, float %b) { | 798 define internal i32 @fcmpOltFloat(float %a, float %b) { |
| 799 entry: | 799 entry: |
| 800 %cmp = fcmp olt float %a, %b | 800 %cmp = fcmp olt float %a, %b |
| 801 %cmp.ret_ext = zext i1 %cmp to i32 | 801 %cmp.ret_ext = zext i1 %cmp to i32 |
| 802 ret i32 %cmp.ret_ext | 802 ret i32 %cmp.ret_ext |
| 803 } | 803 } |
| 804 ; CHECK: fcmpOltFloat: | 804 ; CHECK-LABEL: fcmpOltFloat |
| 805 ; CHECK: ucomiss | 805 ; CHECK: ucomiss |
| 806 ; CHECK: ja . | 806 ; CHECK: ja . |
| 807 | 807 |
| 808 define internal i32 @fcmpOltDouble(double %a, double %b) { | 808 define internal i32 @fcmpOltDouble(double %a, double %b) { |
| 809 entry: | 809 entry: |
| 810 %cmp = fcmp olt double %a, %b | 810 %cmp = fcmp olt double %a, %b |
| 811 %cmp.ret_ext = zext i1 %cmp to i32 | 811 %cmp.ret_ext = zext i1 %cmp to i32 |
| 812 ret i32 %cmp.ret_ext | 812 ret i32 %cmp.ret_ext |
| 813 } | 813 } |
| 814 ; CHECK: fcmpOltDouble: | 814 ; CHECK-LABEL: fcmpOltDouble |
| 815 ; CHECK: ucomisd | 815 ; CHECK: ucomisd |
| 816 ; CHECK: ja . | 816 ; CHECK: ja . |
| 817 | 817 |
| 818 define internal i32 @fcmpOleFloat(float %a, float %b) { | 818 define internal i32 @fcmpOleFloat(float %a, float %b) { |
| 819 entry: | 819 entry: |
| 820 %cmp = fcmp ole float %a, %b | 820 %cmp = fcmp ole float %a, %b |
| 821 %cmp.ret_ext = zext i1 %cmp to i32 | 821 %cmp.ret_ext = zext i1 %cmp to i32 |
| 822 ret i32 %cmp.ret_ext | 822 ret i32 %cmp.ret_ext |
| 823 } | 823 } |
| 824 ; CHECK: fcmpOleFloat: | 824 ; CHECK-LABEL: fcmpOleFloat |
| 825 ; CHECK: ucomiss | 825 ; CHECK: ucomiss |
| 826 ; CHECK: jae . | 826 ; CHECK: jae . |
| 827 | 827 |
| 828 define internal i32 @fcmpOleDouble(double %a, double %b) { | 828 define internal i32 @fcmpOleDouble(double %a, double %b) { |
| 829 entry: | 829 entry: |
| 830 %cmp = fcmp ole double %a, %b | 830 %cmp = fcmp ole double %a, %b |
| 831 %cmp.ret_ext = zext i1 %cmp to i32 | 831 %cmp.ret_ext = zext i1 %cmp to i32 |
| 832 ret i32 %cmp.ret_ext | 832 ret i32 %cmp.ret_ext |
| 833 } | 833 } |
| 834 ; CHECK: fcmpOleDouble: | 834 ; CHECK-LABEL: fcmpOleDouble |
| 835 ; CHECK: ucomisd | 835 ; CHECK: ucomisd |
| 836 ; CHECK: jae . | 836 ; CHECK: jae . |
| 837 | 837 |
| 838 define internal i32 @fcmpOneFloat(float %a, float %b) { | 838 define internal i32 @fcmpOneFloat(float %a, float %b) { |
| 839 entry: | 839 entry: |
| 840 %cmp = fcmp one float %a, %b | 840 %cmp = fcmp one float %a, %b |
| 841 %cmp.ret_ext = zext i1 %cmp to i32 | 841 %cmp.ret_ext = zext i1 %cmp to i32 |
| 842 ret i32 %cmp.ret_ext | 842 ret i32 %cmp.ret_ext |
| 843 } | 843 } |
| 844 ; CHECK: fcmpOneFloat: | 844 ; CHECK-LABEL: fcmpOneFloat |
| 845 ; CHECK: ucomiss | 845 ; CHECK: ucomiss |
| 846 ; CHECK: jne . | 846 ; CHECK: jne . |
| 847 | 847 |
| 848 define internal i32 @fcmpOneDouble(double %a, double %b) { | 848 define internal i32 @fcmpOneDouble(double %a, double %b) { |
| 849 entry: | 849 entry: |
| 850 %cmp = fcmp one double %a, %b | 850 %cmp = fcmp one double %a, %b |
| 851 %cmp.ret_ext = zext i1 %cmp to i32 | 851 %cmp.ret_ext = zext i1 %cmp to i32 |
| 852 ret i32 %cmp.ret_ext | 852 ret i32 %cmp.ret_ext |
| 853 } | 853 } |
| 854 ; CHECK: fcmpOneDouble: | 854 ; CHECK-LABEL: fcmpOneDouble |
| 855 ; CHECK: ucomisd | 855 ; CHECK: ucomisd |
| 856 ; CHECK: jne . | 856 ; CHECK: jne . |
| 857 | 857 |
| 858 define internal i32 @fcmpOrdFloat(float %a, float %b) { | 858 define internal i32 @fcmpOrdFloat(float %a, float %b) { |
| 859 entry: | 859 entry: |
| 860 %cmp = fcmp ord float %a, %b | 860 %cmp = fcmp ord float %a, %b |
| 861 %cmp.ret_ext = zext i1 %cmp to i32 | 861 %cmp.ret_ext = zext i1 %cmp to i32 |
| 862 ret i32 %cmp.ret_ext | 862 ret i32 %cmp.ret_ext |
| 863 } | 863 } |
| 864 ; CHECK: fcmpOrdFloat: | 864 ; CHECK-LABEL: fcmpOrdFloat |
| 865 ; CHECK: ucomiss | 865 ; CHECK: ucomiss |
| 866 ; CHECK: jnp . | 866 ; CHECK: jnp . |
| 867 | 867 |
| 868 define internal i32 @fcmpOrdDouble(double %a, double %b) { | 868 define internal i32 @fcmpOrdDouble(double %a, double %b) { |
| 869 entry: | 869 entry: |
| 870 %cmp = fcmp ord double %a, %b | 870 %cmp = fcmp ord double %a, %b |
| 871 %cmp.ret_ext = zext i1 %cmp to i32 | 871 %cmp.ret_ext = zext i1 %cmp to i32 |
| 872 ret i32 %cmp.ret_ext | 872 ret i32 %cmp.ret_ext |
| 873 } | 873 } |
| 874 ; CHECK: fcmpOrdDouble: | 874 ; CHECK-LABEL: fcmpOrdDouble |
| 875 ; CHECK: ucomisd | 875 ; CHECK: ucomisd |
| 876 ; CHECK: jnp . | 876 ; CHECK: jnp . |
| 877 | 877 |
| 878 define internal i32 @fcmpUeqFloat(float %a, float %b) { | 878 define internal i32 @fcmpUeqFloat(float %a, float %b) { |
| 879 entry: | 879 entry: |
| 880 %cmp = fcmp ueq float %a, %b | 880 %cmp = fcmp ueq float %a, %b |
| 881 %cmp.ret_ext = zext i1 %cmp to i32 | 881 %cmp.ret_ext = zext i1 %cmp to i32 |
| 882 ret i32 %cmp.ret_ext | 882 ret i32 %cmp.ret_ext |
| 883 } | 883 } |
| 884 ; CHECK: fcmpUeqFloat: | 884 ; CHECK-LABEL: fcmpUeqFloat |
| 885 ; CHECK: ucomiss | 885 ; CHECK: ucomiss |
| 886 ; CHECK: je . | 886 ; CHECK: je . |
| 887 | 887 |
| 888 define internal i32 @fcmpUeqDouble(double %a, double %b) { | 888 define internal i32 @fcmpUeqDouble(double %a, double %b) { |
| 889 entry: | 889 entry: |
| 890 %cmp = fcmp ueq double %a, %b | 890 %cmp = fcmp ueq double %a, %b |
| 891 %cmp.ret_ext = zext i1 %cmp to i32 | 891 %cmp.ret_ext = zext i1 %cmp to i32 |
| 892 ret i32 %cmp.ret_ext | 892 ret i32 %cmp.ret_ext |
| 893 } | 893 } |
| 894 ; CHECK: fcmpUeqDouble: | 894 ; CHECK-LABEL: fcmpUeqDouble |
| 895 ; CHECK: ucomisd | 895 ; CHECK: ucomisd |
| 896 ; CHECK: je . | 896 ; CHECK: je . |
| 897 | 897 |
| 898 define internal i32 @fcmpUgtFloat(float %a, float %b) { | 898 define internal i32 @fcmpUgtFloat(float %a, float %b) { |
| 899 entry: | 899 entry: |
| 900 %cmp = fcmp ugt float %a, %b | 900 %cmp = fcmp ugt float %a, %b |
| 901 %cmp.ret_ext = zext i1 %cmp to i32 | 901 %cmp.ret_ext = zext i1 %cmp to i32 |
| 902 ret i32 %cmp.ret_ext | 902 ret i32 %cmp.ret_ext |
| 903 } | 903 } |
| 904 ; CHECK: fcmpUgtFloat: | 904 ; CHECK-LABEL: fcmpUgtFloat |
| 905 ; CHECK: ucomiss | 905 ; CHECK: ucomiss |
| 906 ; CHECK: jb . | 906 ; CHECK: jb . |
| 907 | 907 |
| 908 define internal i32 @fcmpUgtDouble(double %a, double %b) { | 908 define internal i32 @fcmpUgtDouble(double %a, double %b) { |
| 909 entry: | 909 entry: |
| 910 %cmp = fcmp ugt double %a, %b | 910 %cmp = fcmp ugt double %a, %b |
| 911 %cmp.ret_ext = zext i1 %cmp to i32 | 911 %cmp.ret_ext = zext i1 %cmp to i32 |
| 912 ret i32 %cmp.ret_ext | 912 ret i32 %cmp.ret_ext |
| 913 } | 913 } |
| 914 ; CHECK: fcmpUgtDouble: | 914 ; CHECK-LABEL: fcmpUgtDouble |
| 915 ; CHECK: ucomisd | 915 ; CHECK: ucomisd |
| 916 ; CHECK: jb . | 916 ; CHECK: jb . |
| 917 | 917 |
| 918 define internal i32 @fcmpUgeFloat(float %a, float %b) { | 918 define internal i32 @fcmpUgeFloat(float %a, float %b) { |
| 919 entry: | 919 entry: |
| 920 %cmp = fcmp uge float %a, %b | 920 %cmp = fcmp uge float %a, %b |
| 921 %cmp.ret_ext = zext i1 %cmp to i32 | 921 %cmp.ret_ext = zext i1 %cmp to i32 |
| 922 ret i32 %cmp.ret_ext | 922 ret i32 %cmp.ret_ext |
| 923 } | 923 } |
| 924 ; CHECK: fcmpUgeFloat: | 924 ; CHECK-LABEL: fcmpUgeFloat |
| 925 ; CHECK: ucomiss | 925 ; CHECK: ucomiss |
| 926 ; CHECK: jbe . | 926 ; CHECK: jbe . |
| 927 | 927 |
| 928 define internal i32 @fcmpUgeDouble(double %a, double %b) { | 928 define internal i32 @fcmpUgeDouble(double %a, double %b) { |
| 929 entry: | 929 entry: |
| 930 %cmp = fcmp uge double %a, %b | 930 %cmp = fcmp uge double %a, %b |
| 931 %cmp.ret_ext = zext i1 %cmp to i32 | 931 %cmp.ret_ext = zext i1 %cmp to i32 |
| 932 ret i32 %cmp.ret_ext | 932 ret i32 %cmp.ret_ext |
| 933 } | 933 } |
| 934 ; CHECK: fcmpUgeDouble: | 934 ; CHECK-LABEL: fcmpUgeDouble |
| 935 ; CHECK: ucomisd | 935 ; CHECK: ucomisd |
| 936 ; CHECK: jbe . | 936 ; CHECK: jbe . |
| 937 | 937 |
| 938 define internal i32 @fcmpUltFloat(float %a, float %b) { | 938 define internal i32 @fcmpUltFloat(float %a, float %b) { |
| 939 entry: | 939 entry: |
| 940 %cmp = fcmp ult float %a, %b | 940 %cmp = fcmp ult float %a, %b |
| 941 %cmp.ret_ext = zext i1 %cmp to i32 | 941 %cmp.ret_ext = zext i1 %cmp to i32 |
| 942 ret i32 %cmp.ret_ext | 942 ret i32 %cmp.ret_ext |
| 943 } | 943 } |
| 944 ; CHECK: fcmpUltFloat: | 944 ; CHECK-LABEL: fcmpUltFloat |
| 945 ; CHECK: ucomiss | 945 ; CHECK: ucomiss |
| 946 ; CHECK: jb . | 946 ; CHECK: jb . |
| 947 | 947 |
| 948 define internal i32 @fcmpUltDouble(double %a, double %b) { | 948 define internal i32 @fcmpUltDouble(double %a, double %b) { |
| 949 entry: | 949 entry: |
| 950 %cmp = fcmp ult double %a, %b | 950 %cmp = fcmp ult double %a, %b |
| 951 %cmp.ret_ext = zext i1 %cmp to i32 | 951 %cmp.ret_ext = zext i1 %cmp to i32 |
| 952 ret i32 %cmp.ret_ext | 952 ret i32 %cmp.ret_ext |
| 953 } | 953 } |
| 954 ; CHECK: fcmpUltDouble: | 954 ; CHECK-LABEL: fcmpUltDouble |
| 955 ; CHECK: ucomisd | 955 ; CHECK: ucomisd |
| 956 ; CHECK: jb . | 956 ; CHECK: jb . |
| 957 | 957 |
| 958 define internal i32 @fcmpUleFloat(float %a, float %b) { | 958 define internal i32 @fcmpUleFloat(float %a, float %b) { |
| 959 entry: | 959 entry: |
| 960 %cmp = fcmp ule float %a, %b | 960 %cmp = fcmp ule float %a, %b |
| 961 %cmp.ret_ext = zext i1 %cmp to i32 | 961 %cmp.ret_ext = zext i1 %cmp to i32 |
| 962 ret i32 %cmp.ret_ext | 962 ret i32 %cmp.ret_ext |
| 963 } | 963 } |
| 964 ; CHECK: fcmpUleFloat: | 964 ; CHECK-LABEL: fcmpUleFloat |
| 965 ; CHECK: ucomiss | 965 ; CHECK: ucomiss |
| 966 ; CHECK: jbe . | 966 ; CHECK: jbe . |
| 967 | 967 |
| 968 define internal i32 @fcmpUleDouble(double %a, double %b) { | 968 define internal i32 @fcmpUleDouble(double %a, double %b) { |
| 969 entry: | 969 entry: |
| 970 %cmp = fcmp ule double %a, %b | 970 %cmp = fcmp ule double %a, %b |
| 971 %cmp.ret_ext = zext i1 %cmp to i32 | 971 %cmp.ret_ext = zext i1 %cmp to i32 |
| 972 ret i32 %cmp.ret_ext | 972 ret i32 %cmp.ret_ext |
| 973 } | 973 } |
| 974 ; CHECK: fcmpUleDouble: | 974 ; CHECK-LABEL: fcmpUleDouble |
| 975 ; CHECK: ucomisd | 975 ; CHECK: ucomisd |
| 976 ; CHECK: jbe . | 976 ; CHECK: jbe . |
| 977 | 977 |
| 978 define internal i32 @fcmpUneFloat(float %a, float %b) { | 978 define internal i32 @fcmpUneFloat(float %a, float %b) { |
| 979 entry: | 979 entry: |
| 980 %cmp = fcmp une float %a, %b | 980 %cmp = fcmp une float %a, %b |
| 981 %cmp.ret_ext = zext i1 %cmp to i32 | 981 %cmp.ret_ext = zext i1 %cmp to i32 |
| 982 ret i32 %cmp.ret_ext | 982 ret i32 %cmp.ret_ext |
| 983 } | 983 } |
| 984 ; CHECK: fcmpUneFloat: | 984 ; CHECK-LABEL: fcmpUneFloat |
| 985 ; CHECK: ucomiss | 985 ; CHECK: ucomiss |
| 986 ; CHECK: jne . | 986 ; CHECK: jne . |
| 987 ; CHECK: jp . | 987 ; CHECK: jp . |
| 988 | 988 |
| 989 define internal i32 @fcmpUneDouble(double %a, double %b) { | 989 define internal i32 @fcmpUneDouble(double %a, double %b) { |
| 990 entry: | 990 entry: |
| 991 %cmp = fcmp une double %a, %b | 991 %cmp = fcmp une double %a, %b |
| 992 %cmp.ret_ext = zext i1 %cmp to i32 | 992 %cmp.ret_ext = zext i1 %cmp to i32 |
| 993 ret i32 %cmp.ret_ext | 993 ret i32 %cmp.ret_ext |
| 994 } | 994 } |
| 995 ; CHECK: fcmpUneDouble: | 995 ; CHECK-LABEL: fcmpUneDouble |
| 996 ; CHECK: ucomisd | 996 ; CHECK: ucomisd |
| 997 ; CHECK: jne . | 997 ; CHECK: jne . |
| 998 ; CHECK: jp . | 998 ; CHECK: jp . |
| 999 | 999 |
| 1000 define internal i32 @fcmpUnoFloat(float %a, float %b) { | 1000 define internal i32 @fcmpUnoFloat(float %a, float %b) { |
| 1001 entry: | 1001 entry: |
| 1002 %cmp = fcmp uno float %a, %b | 1002 %cmp = fcmp uno float %a, %b |
| 1003 %cmp.ret_ext = zext i1 %cmp to i32 | 1003 %cmp.ret_ext = zext i1 %cmp to i32 |
| 1004 ret i32 %cmp.ret_ext | 1004 ret i32 %cmp.ret_ext |
| 1005 } | 1005 } |
| 1006 ; CHECK: fcmpUnoFloat: | 1006 ; CHECK-LABEL: fcmpUnoFloat |
| 1007 ; CHECK: ucomiss | 1007 ; CHECK: ucomiss |
| 1008 ; CHECK: jp . | 1008 ; CHECK: jp . |
| 1009 | 1009 |
| 1010 define internal i32 @fcmpUnoDouble(double %a, double %b) { | 1010 define internal i32 @fcmpUnoDouble(double %a, double %b) { |
| 1011 entry: | 1011 entry: |
| 1012 %cmp = fcmp uno double %a, %b | 1012 %cmp = fcmp uno double %a, %b |
| 1013 %cmp.ret_ext = zext i1 %cmp to i32 | 1013 %cmp.ret_ext = zext i1 %cmp to i32 |
| 1014 ret i32 %cmp.ret_ext | 1014 ret i32 %cmp.ret_ext |
| 1015 } | 1015 } |
| 1016 ; CHECK: fcmpUnoDouble: | 1016 ; CHECK-LABEL: fcmpUnoDouble |
| 1017 ; CHECK: ucomisd | 1017 ; CHECK: ucomisd |
| 1018 ; CHECK: jp . | 1018 ; CHECK: jp . |
| 1019 | 1019 |
| 1020 define internal i32 @fcmpTrueFloat(float %a, float %b) { | 1020 define internal i32 @fcmpTrueFloat(float %a, float %b) { |
| 1021 entry: | 1021 entry: |
| 1022 %cmp = fcmp true float %a, %b | 1022 %cmp = fcmp true float %a, %b |
| 1023 %cmp.ret_ext = zext i1 %cmp to i32 | 1023 %cmp.ret_ext = zext i1 %cmp to i32 |
| 1024 ret i32 %cmp.ret_ext | 1024 ret i32 %cmp.ret_ext |
| 1025 } | 1025 } |
| 1026 ; CHECK: fcmpTrueFloat: | 1026 ; CHECK-LABEL: fcmpTrueFloat |
| 1027 ; CHECK: mov {{.*}}, 1 | 1027 ; CHECK: mov {{.*}}, 1 |
| 1028 | 1028 |
| 1029 define internal i32 @fcmpTrueDouble(double %a, double %b) { | 1029 define internal i32 @fcmpTrueDouble(double %a, double %b) { |
| 1030 entry: | 1030 entry: |
| 1031 %cmp = fcmp true double %a, %b | 1031 %cmp = fcmp true double %a, %b |
| 1032 %cmp.ret_ext = zext i1 %cmp to i32 | 1032 %cmp.ret_ext = zext i1 %cmp to i32 |
| 1033 ret i32 %cmp.ret_ext | 1033 ret i32 %cmp.ret_ext |
| 1034 } | 1034 } |
| 1035 ; CHECK: fcmpTrueDouble: | 1035 ; CHECK-LABEL: fcmpTrueDouble |
| 1036 ; CHECK: mov {{.*}}, 1 | 1036 ; CHECK: mov {{.*}}, 1 |
| 1037 | 1037 |
| 1038 define internal float @loadFloat(i32 %a) { | 1038 define internal float @loadFloat(i32 %a) { |
| 1039 entry: | 1039 entry: |
| 1040 %__1 = inttoptr i32 %a to float* | 1040 %__1 = inttoptr i32 %a to float* |
| 1041 %v0 = load float* %__1, align 4 | 1041 %v0 = load float* %__1, align 4 |
| 1042 ret float %v0 | 1042 ret float %v0 |
| 1043 } | 1043 } |
| 1044 ; CHECK: loadFloat: | 1044 ; CHECK-LABEL: loadFloat |
| 1045 ; CHECK: movss | 1045 ; CHECK: movss |
| 1046 ; CHECK: fld | 1046 ; CHECK: fld |
| 1047 | 1047 |
| 1048 define internal double @loadDouble(i32 %a) { | 1048 define internal double @loadDouble(i32 %a) { |
| 1049 entry: | 1049 entry: |
| 1050 %__1 = inttoptr i32 %a to double* | 1050 %__1 = inttoptr i32 %a to double* |
| 1051 %v0 = load double* %__1, align 8 | 1051 %v0 = load double* %__1, align 8 |
| 1052 ret double %v0 | 1052 ret double %v0 |
| 1053 } | 1053 } |
| 1054 ; CHECK: loadDouble: | 1054 ; CHECK-LABEL: loadDouble |
| 1055 ; CHECK: movsd | 1055 ; CHECK: movsd |
| 1056 ; CHECK: fld | 1056 ; CHECK: fld |
| 1057 | 1057 |
| 1058 define internal void @storeFloat(i32 %a, float %value) { | 1058 define internal void @storeFloat(i32 %a, float %value) { |
| 1059 entry: | 1059 entry: |
| 1060 %__2 = inttoptr i32 %a to float* | 1060 %__2 = inttoptr i32 %a to float* |
| 1061 store float %value, float* %__2, align 4 | 1061 store float %value, float* %__2, align 4 |
| 1062 ret void | 1062 ret void |
| 1063 } | 1063 } |
| 1064 ; CHECK: storeFloat: | 1064 ; CHECK-LABEL: storeFloat: |
| 1065 ; CHECK: movss |
| 1065 ; CHECK: movss | 1066 ; CHECK: movss |
| 1066 | 1067 |
| 1067 define internal void @storeDouble(i32 %a, double %value) { | 1068 define internal void @storeDouble(i32 %a, double %value) { |
| 1068 entry: | 1069 entry: |
| 1069 %__2 = inttoptr i32 %a to double* | 1070 %__2 = inttoptr i32 %a to double* |
| 1070 store double %value, double* %__2, align 8 | 1071 store double %value, double* %__2, align 8 |
| 1071 ret void | 1072 ret void |
| 1072 } | 1073 } |
| 1073 ; CHECK: storeDouble: | 1074 ; CHECK-LABEL: storeDouble: |
| 1075 ; CHECK: movsd |
| 1074 ; CHECK: movsd | 1076 ; CHECK: movsd |
| 1075 | 1077 |
| 1076 define internal void @storeFloatConst(i32 %a) { | 1078 define internal void @storeFloatConst(i32 %a) { |
| 1077 entry: | 1079 entry: |
| 1078 %a.asptr = inttoptr i32 %a to float* | 1080 %a.asptr = inttoptr i32 %a to float* |
| 1079 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 | 1081 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 |
| 1080 ret void | 1082 ret void |
| 1081 } | 1083 } |
| 1082 ; CHECK: storeFloatConst: | 1084 ; CHECK-LABEL: storeFloatConst |
| 1083 ; CHECK: mov | 1085 ; CHECK: movss |
| 1084 ; CHECK: mov | 1086 ; CHECK: movss |
| 1085 | 1087 |
| 1086 define internal void @storeDoubleConst(i32 %a) { | 1088 define internal void @storeDoubleConst(i32 %a) { |
| 1087 entry: | 1089 entry: |
| 1088 %a.asptr = inttoptr i32 %a to double* | 1090 %a.asptr = inttoptr i32 %a to double* |
| 1089 store double 1.230000e+00, double* %a.asptr, align 8 | 1091 store double 1.230000e+00, double* %a.asptr, align 8 |
| 1090 ret void | 1092 ret void |
| 1091 } | 1093 } |
| 1092 ; CHECK: storeDoubleConst: | 1094 ; CHECK-LABEL: storeDoubleConst |
| 1093 ; CHECK: mov | 1095 ; CHECK: movsd |
| 1094 ; CHECK: mov | 1096 ; CHECK: movsd |
| 1095 | 1097 |
| 1096 define internal float @selectFloatVarVar(float %a, float %b) { | 1098 define internal float @selectFloatVarVar(float %a, float %b) { |
| 1097 entry: | 1099 entry: |
| 1098 %cmp = fcmp olt float %a, %b | 1100 %cmp = fcmp olt float %a, %b |
| 1099 %cond = select i1 %cmp, float %a, float %b | 1101 %cond = select i1 %cmp, float %a, float %b |
| 1100 ret float %cond | 1102 ret float %cond |
| 1101 } | 1103 } |
| 1102 ; CHECK: selectFloatVarVar: | 1104 ; CHECK-LABEL: selectFloatVarVar |
| 1103 ; CHECK: ucomiss | 1105 ; CHECK: ucomiss |
| 1104 ; CHECK: ja . | 1106 ; CHECK: ja . |
| 1105 ; CHECK: fld | 1107 ; CHECK: fld |
| 1106 | 1108 |
| 1107 define internal double @selectDoubleVarVar(double %a, double %b) { | 1109 define internal double @selectDoubleVarVar(double %a, double %b) { |
| 1108 entry: | 1110 entry: |
| 1109 %cmp = fcmp olt double %a, %b | 1111 %cmp = fcmp olt double %a, %b |
| 1110 %cond = select i1 %cmp, double %a, double %b | 1112 %cond = select i1 %cmp, double %a, double %b |
| 1111 ret double %cond | 1113 ret double %cond |
| 1112 } | 1114 } |
| 1113 ; CHECK: selectDoubleVarVar: | 1115 ; CHECK-LABEL: selectDoubleVarVar |
| 1114 ; CHECK: ucomisd | 1116 ; CHECK: ucomisd |
| 1115 ; CHECK: ja . | 1117 ; CHECK: ja . |
| 1116 ; CHECK: fld | 1118 ; CHECK: fld |
| 1117 | 1119 |
| 1118 ; ERRORS-NOT: ICE translation error | 1120 ; ERRORS-NOT: ICE translation error |
| 1119 ; DUMP-NOT: SZ | 1121 ; DUMP-NOT: SZ |
| OLD | NEW |