Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
      2 
      3 define i32 @test_floattoi32(float %in) {
      4 ; CHECK-LABEL: test_floattoi32:
      5 
      6   %signed = fptosi float %in to i32
      7   %unsigned = fptoui float %in to i32
      8 ; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{s[0-9]+}}
      9 ; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{s[0-9]+}}
     10 
     11   %res = sub i32 %signed, %unsigned
     12 ; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]]
     13 
     14   ret i32 %res
     15 ; CHECK: ret
     16 }
     17 
     18 define i32 @test_doubletoi32(double %in) {
     19 ; CHECK-LABEL: test_doubletoi32:
     20 
     21   %signed = fptosi double %in to i32
     22   %unsigned = fptoui double %in to i32
     23 ; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{d[0-9]+}}
     24 ; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{d[0-9]+}}
     25 
     26   %res = sub i32 %signed, %unsigned
     27 ; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]]
     28 
     29   ret i32 %res
     30 ; CHECK: ret
     31 }
     32 
     33 define i64 @test_floattoi64(float %in) {
     34 ; CHECK-LABEL: test_floattoi64:
     35 
     36   %signed = fptosi float %in to i64
     37   %unsigned = fptoui float %in to i64
     38 ; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{s[0-9]+}}
     39 ; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{s[0-9]+}}
     40 
     41   %res = sub i64 %signed, %unsigned
     42 ; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]]
     43 
     44   ret i64 %res
     45 ; CHECK: ret
     46 }
     47 
     48 define i64 @test_doubletoi64(double %in) {
     49 ; CHECK-LABEL: test_doubletoi64:
     50 
     51   %signed = fptosi double %in to i64
     52   %unsigned = fptoui double %in to i64
     53 ; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{d[0-9]+}}
     54 ; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{d[0-9]+}}
     55 
     56   %res = sub i64 %signed, %unsigned
     57 ; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]]
     58 
     59   ret i64 %res
     60 ; CHECK: ret
     61 }
     62 
     63 define float @test_i32tofloat(i32 %in) {
     64 ; CHECK-LABEL: test_i32tofloat:
     65 
     66   %signed = sitofp i32 %in to float
     67   %unsigned = uitofp i32 %in to float
     68 ; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{w[0-9]+}}
     69 ; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{w[0-9]+}}
     70 
     71   %res = fsub float %signed, %unsigned
     72 ; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]]
     73   ret float %res
     74 ; CHECK: ret
     75 }
     76 
     77 define double @test_i32todouble(i32 %in) {
     78 ; CHECK-LABEL: test_i32todouble:
     79 
     80   %signed = sitofp i32 %in to double
     81   %unsigned = uitofp i32 %in to double
     82 ; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{w[0-9]+}}
     83 ; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{w[0-9]+}}
     84 
     85   %res = fsub double %signed, %unsigned
     86 ; CHECK: fsub {{d[0-9]+}}, [[SIG]], [[UNSIG]]
     87   ret double %res
     88 ; CHECK: ret
     89 }
     90 
     91 define float @test_i64tofloat(i64 %in) {
     92 ; CHECK-LABEL: test_i64tofloat:
     93 
     94   %signed = sitofp i64 %in to float
     95   %unsigned = uitofp i64 %in to float
     96 ; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{x[0-9]+}}
     97 ; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{x[0-9]+}}
     98 
     99   %res = fsub float %signed, %unsigned
    100 ; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]]
    101   ret float %res
    102 ; CHECK: ret
    103 }
    104 
    105 define double @test_i64todouble(i64 %in) {
    106 ; CHECK-LABEL: test_i64todouble:
    107 
    108   %signed = sitofp i64 %in to double
    109   %unsigned = uitofp i64 %in to double
    110 ; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{x[0-9]+}}
    111 ; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{x[0-9]+}}
    112 
    113   %res = fsub double %signed, %unsigned
    114 ; CHECK: sub {{d[0-9]+}}, [[SIG]], [[UNSIG]]
    115   ret double %res
    116 ; CHECK: ret
    117 }
    118 
    119 define i32 @test_bitcastfloattoi32(float %in) {
    120 ; CHECK-LABEL: test_bitcastfloattoi32:
    121 
    122    %res = bitcast float %in to i32
    123 ; CHECK: fmov {{w[0-9]+}}, {{s[0-9]+}}
    124    ret i32 %res
    125 }
    126 
    127 define i64 @test_bitcastdoubletoi64(double %in) {
    128 ; CHECK-LABEL: test_bitcastdoubletoi64:
    129 
    130    %res = bitcast double %in to i64
    131 ; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
    132    ret i64 %res
    133 }
    134 
    135 define float @test_bitcasti32tofloat(i32 %in) {
    136 ; CHECK-LABEL: test_bitcasti32tofloat:
    137 
    138    %res = bitcast i32 %in to float
    139 ; CHECK: fmov {{s[0-9]+}}, {{w[0-9]+}}
    140    ret float %res
    141 
    142 }
    143 
    144 define double @test_bitcasti64todouble(i64 %in) {
    145 ; CHECK-LABEL: test_bitcasti64todouble:
    146 
    147    %res = bitcast i64 %in to double
    148 ; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
    149    ret double %res
    150 
    151 }
    152 
    153 define double @bitcast_fabs(double %x) {
    154 ; CHECK-LABEL: bitcast_fabs:
    155 ; CHECK:       ; BB#0:
    156 ; CHECK-NEXT:    fabs d0, d0
    157 ; CHECK-NEXT:    ret
    158 ;
    159   %bc1 = bitcast double %x to i64
    160   %and = and i64 %bc1, 9223372036854775807
    161   %bc2 = bitcast i64 %and to double
    162   ret double %bc2
    163 }
    164 
    165 define float @bitcast_fneg(float %x) {
    166 ; CHECK-LABEL: bitcast_fneg:
    167 ; CHECK:       ; BB#0:
    168 ; CHECK-NEXT:    fneg s0, s0
    169 ; CHECK-NEXT:    ret
    170 ;
    171   %bc1 = bitcast float %x to i32
    172   %xor = xor i32 %bc1, 2147483648
    173   %bc2 = bitcast i32 %xor to float
    174   ret float %bc2
    175 }
    176 
    177