1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv2_sf -mattr=+fpuv2_df | FileCheck %s --check-prefix=CHECK-DF 4; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -float-abi=hard -mattr=+hard-float -mattr=+2e3 -mattr=+fpuv3_sf -mattr=+fpuv3_df | FileCheck %s --check-prefix=CHECK-DF2 5 6define double @FADD_DOUBLE(double %x, double %y) { 7; CHECK-DF-LABEL: FADD_DOUBLE: 8; CHECK-DF: # %bb.0: # %entry 9; CHECK-DF-NEXT: faddd vr0, vr1, vr0 10; CHECK-DF-NEXT: rts16 11; 12; CHECK-DF2-LABEL: FADD_DOUBLE: 13; CHECK-DF2: # %bb.0: # %entry 14; CHECK-DF2-NEXT: fadd.64 vr0, vr1, vr0 15; CHECK-DF2-NEXT: rts16 16entry: 17 %fadd = fadd double %y, %x 18 ret double %fadd 19} 20 21define double @FADD_DOUBLE_I(double %x) { 22; CHECK-DF-LABEL: FADD_DOUBLE_I: 23; CHECK-DF: # %bb.0: # %entry 24; CHECK-DF-NEXT: grs32 a0, .LCPI1_0 25; CHECK-DF-NEXT: fldd vr1, (a0, 0) 26; CHECK-DF-NEXT: faddd vr0, vr0, vr1 27; CHECK-DF-NEXT: rts16 28; CHECK-DF-NEXT: .p2align 1 29; CHECK-DF-NEXT: # %bb.1: 30; CHECK-DF-NEXT: .p2align 2, 0x0 31; CHECK-DF-NEXT: .LCPI1_0: 32; CHECK-DF-NEXT: .quad 0xbff0000000000000 # double -1 33; 34; CHECK-DF2-LABEL: FADD_DOUBLE_I: 35; CHECK-DF2: # %bb.0: # %entry 36; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI1_0] 37; CHECK-DF2-NEXT: fadd.64 vr0, vr0, vr1 38; CHECK-DF2-NEXT: rts16 39; CHECK-DF2-NEXT: .p2align 1 40; CHECK-DF2-NEXT: # %bb.1: 41; CHECK-DF2-NEXT: .p2align 2, 0x0 42; CHECK-DF2-NEXT: .LCPI1_0: 43; CHECK-DF2-NEXT: .quad 0xbff0000000000000 # double -1 44entry: 45 %fadd = fadd double %x, -1.0 46 ret double %fadd 47} 48 49define double @FSUB_DOUBLE(double %x, double %y) { 50; CHECK-DF-LABEL: FSUB_DOUBLE: 51; CHECK-DF: # %bb.0: # %entry 52; CHECK-DF-NEXT: fsubd vr0, vr1, vr0 53; CHECK-DF-NEXT: rts16 54; 55; CHECK-DF2-LABEL: FSUB_DOUBLE: 56; CHECK-DF2: # %bb.0: # %entry 57; CHECK-DF2-NEXT: fsub.64 vr0, vr1, vr0 58; CHECK-DF2-NEXT: rts16 59 60entry: 61 %fsub = fsub double %y, %x 62 ret double %fsub 63} 64 65define double @FSUB_DOUBLE_I(double %x) { 66; 67; CHECK-DF-LABEL: FSUB_DOUBLE_I: 68; CHECK-DF: # %bb.0: # %entry 69; CHECK-DF-NEXT: grs32 a0, .LCPI3_0 70; CHECK-DF-NEXT: fldd vr1, (a0, 0) 71; CHECK-DF-NEXT: faddd vr0, vr0, vr1 72; CHECK-DF-NEXT: rts16 73; CHECK-DF-NEXT: .p2align 1 74; CHECK-DF-NEXT: # %bb.1: 75; CHECK-DF-NEXT: .p2align 2, 0x0 76; CHECK-DF-NEXT: .LCPI3_0: 77; CHECK-DF-NEXT: .quad 0x3ff0000000000000 # double 1 78; 79; CHECK-DF2-LABEL: FSUB_DOUBLE_I: 80; CHECK-DF2: # %bb.0: # %entry 81; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI3_0] 82; CHECK-DF2-NEXT: fadd.64 vr0, vr0, vr1 83; CHECK-DF2-NEXT: rts16 84; CHECK-DF2-NEXT: .p2align 1 85; CHECK-DF2-NEXT: # %bb.1: 86; CHECK-DF2-NEXT: .p2align 2, 0x0 87; CHECK-DF2-NEXT: .LCPI3_0: 88; CHECK-DF2-NEXT: .quad 0x3ff0000000000000 # double 1 89 90entry: 91 %fsub = fsub double %x, -1.0 92 ret double %fsub 93} 94 95define double @FMUL_DOUBLE(double %x, double %y) { 96; 97; CHECK-DF-LABEL: FMUL_DOUBLE: 98; CHECK-DF: # %bb.0: # %entry 99; CHECK-DF-NEXT: fmuld vr0, vr1, vr0 100; CHECK-DF-NEXT: rts16 101; 102; CHECK-DF2-LABEL: FMUL_DOUBLE: 103; CHECK-DF2: # %bb.0: # %entry 104; CHECK-DF2-NEXT: fmul.64 vr0, vr1, vr0 105; CHECK-DF2-NEXT: rts16 106entry: 107 %fmul = fmul double %y, %x 108 ret double %fmul 109} 110 111define double @FNMUL_DOUBLE_a(double %x, double %y) { 112; 113; CHECK-DF-LABEL: FNMUL_DOUBLE_a: 114; CHECK-DF: # %bb.0: # %entry 115; CHECK-DF-NEXT: fnmuld vr0, vr1, vr0 116; CHECK-DF-NEXT: rts16 117; 118; CHECK-DF2-LABEL: FNMUL_DOUBLE_a: 119; CHECK-DF2: # %bb.0: # %entry 120; CHECK-DF2-NEXT: fnmul.64 vr0, vr1, vr0 121; CHECK-DF2-NEXT: rts16 122entry: 123 %z = fneg double %y 124 %fnmul = fmul double %z, %x 125 ret double %fnmul 126} 127 128define double @FNMUL_DOUBLE_b(double %x, double %y) { 129; CHECK-DF-LABEL: FNMUL_DOUBLE_b: 130; CHECK-DF: # %bb.0: # %entry 131; CHECK-DF-NEXT: fnmuld vr0, vr0, vr1 132; CHECK-DF-NEXT: rts16 133; 134; CHECK-DF2-LABEL: FNMUL_DOUBLE_b: 135; CHECK-DF2: # %bb.0: # %entry 136; CHECK-DF2-NEXT: fnmul.64 vr0, vr0, vr1 137; CHECK-DF2-NEXT: rts16 138entry: 139 %z = fneg double %x 140 %fnmul = fmul double %y, %z 141 ret double %fnmul 142} 143 144define double @FMUL_DOUBLE_I(double %x) { 145; 146; CHECK-DF-LABEL: FMUL_DOUBLE_I: 147; CHECK-DF: # %bb.0: # %entry 148; CHECK-DF-NEXT: grs32 a0, .LCPI7_0 149; CHECK-DF-NEXT: fldd vr1, (a0, 0) 150; CHECK-DF-NEXT: fmuld vr0, vr0, vr1 151; CHECK-DF-NEXT: rts16 152; CHECK-DF-NEXT: .p2align 1 153; CHECK-DF-NEXT: # %bb.1: 154; CHECK-DF-NEXT: .p2align 2, 0x0 155; CHECK-DF-NEXT: .LCPI7_0: 156; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7 157; 158; CHECK-DF2-LABEL: FMUL_DOUBLE_I: 159; CHECK-DF2: # %bb.0: # %entry 160; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI7_0] 161; CHECK-DF2-NEXT: fmul.64 vr0, vr0, vr1 162; CHECK-DF2-NEXT: rts16 163; CHECK-DF2-NEXT: .p2align 1 164; CHECK-DF2-NEXT: # %bb.1: 165; CHECK-DF2-NEXT: .p2align 2, 0x0 166; CHECK-DF2-NEXT: .LCPI7_0: 167; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7 168entry: 169 %fmul = fmul double %x, -7.0 170 ret double %fmul 171} 172 173define double @FDIV_DOUBLE(double %x, double %y) { 174; 175; 176; CHECK-DF-LABEL: FDIV_DOUBLE: 177; CHECK-DF: # %bb.0: # %entry 178; CHECK-DF-NEXT: fdivd vr0, vr1, vr0 179; CHECK-DF-NEXT: rts16 180; 181; CHECK-DF2-LABEL: FDIV_DOUBLE: 182; CHECK-DF2: # %bb.0: # %entry 183; CHECK-DF2-NEXT: fdiv.64 vr0, vr1, vr0 184; CHECK-DF2-NEXT: rts16 185 186entry: 187 %fdiv = fdiv double %y, %x 188 ret double %fdiv 189} 190 191define double @FDIV_DOUBLE_I(double %x) { 192; 193; CHECK-DF-LABEL: FDIV_DOUBLE_I: 194; CHECK-DF: # %bb.0: # %entry 195; CHECK-DF-NEXT: grs32 a0, .LCPI9_0 196; CHECK-DF-NEXT: fldd vr1, (a0, 0) 197; CHECK-DF-NEXT: fdivd vr0, vr0, vr1 198; CHECK-DF-NEXT: rts16 199; CHECK-DF-NEXT: .p2align 1 200; CHECK-DF-NEXT: # %bb.1: 201; CHECK-DF-NEXT: .p2align 2, 0x0 202; CHECK-DF-NEXT: .LCPI9_0: 203; CHECK-DF-NEXT: .quad 0xc01c000000000000 # double -7 204; 205; CHECK-DF2-LABEL: FDIV_DOUBLE_I: 206; CHECK-DF2: # %bb.0: # %entry 207; CHECK-DF2-NEXT: flrw.64 vr1, [.LCPI9_0] 208; CHECK-DF2-NEXT: fdiv.64 vr0, vr0, vr1 209; CHECK-DF2-NEXT: rts16 210; CHECK-DF2-NEXT: .p2align 1 211; CHECK-DF2-NEXT: # %bb.1: 212; CHECK-DF2-NEXT: .p2align 2, 0x0 213; CHECK-DF2-NEXT: .LCPI9_0: 214; CHECK-DF2-NEXT: .quad 0xc01c000000000000 # double -7 215entry: 216 %fdiv = fdiv double %x, -7.0 217 ret double %fdiv 218} 219 220define double @FNEG_DOUBLE(double %x) { 221; 222; CHECK-DF-LABEL: FNEG_DOUBLE: 223; CHECK-DF: # %bb.0: # %entry 224; CHECK-DF-NEXT: fnegd vr0, vr0 225; CHECK-DF-NEXT: rts16 226; 227; CHECK-DF2-LABEL: FNEG_DOUBLE: 228; CHECK-DF2: # %bb.0: # %entry 229; CHECK-DF2-NEXT: fneg.64 vr0, vr0 230; CHECK-DF2-NEXT: rts16 231entry: 232 %fneg = fneg double %x 233 ret double %fneg 234} 235 236; double --> float 237define float @fptruncR_double_0(double %x) { 238; 239; CHECK-DF-LABEL: fptruncR_double_0: 240; CHECK-DF: # %bb.0: # %entry 241; CHECK-DF-NEXT: fdtos vr0, vr0 242; CHECK-DF-NEXT: rts16 243; 244; CHECK-DF2-LABEL: fptruncR_double_0: 245; CHECK-DF2: # %bb.0: # %entry 246; CHECK-DF2-NEXT: fdtos vr0, vr0 247; CHECK-DF2-NEXT: rts16 248entry: 249 %fptrunc = fptrunc double %x to float 250 ret float %fptrunc 251} 252 253define double @fpextR_double_0(float %x) { 254; 255; CHECK-DF-LABEL: fpextR_double_0: 256; CHECK-DF: # %bb.0: # %entry 257; CHECK-DF-NEXT: fstod vr0, vr0 258; CHECK-DF-NEXT: rts16 259; 260; CHECK-DF2-LABEL: fpextR_double_0: 261; CHECK-DF2: # %bb.0: # %entry 262; CHECK-DF2-NEXT: fstod vr0, vr0 263; CHECK-DF2-NEXT: rts16 264entry: 265 %fpext = fpext float %x to double 266 ret double %fpext 267} 268