1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -mtriple=x86_64-- -expand-large-fp-convert < %s | FileCheck %s 3; RUN: opt -S -mtriple=x86_64-- -passes=expand-large-fp-convert < %s | FileCheck %s 4 5define i129 @halftosi129(half %a) { 6; CHECK-LABEL: @halftosi129( 7; CHECK-NEXT: [[TMP1:%.*]] = fptosi half [[A:%.*]] to i32 8; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[TMP1]] to i129 9; CHECK-NEXT: ret i129 [[TMP2]] 10; 11 %conv = fptosi half %a to i129 12 ret i129 %conv 13} 14 15define i129 @floattosi129(float %a) { 16; CHECK-LABEL: @floattosi129( 17; CHECK-NEXT: fp-to-i-entry: 18; CHECK-NEXT: [[TMP0:%.*]] = bitcast float [[A:%.*]] to i32 19; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i129 20; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], -1 21; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1 22; CHECK-NEXT: [[TMP4:%.*]] = lshr i129 [[TMP1]], 23 23; CHECK-NEXT: [[TMP5:%.*]] = and i129 [[TMP4]], 255 24; CHECK-NEXT: [[TMP6:%.*]] = and i129 [[TMP1]], 8388607 25; CHECK-NEXT: [[TMP7:%.*]] = or i129 [[TMP6]], 8388608 26; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 127 27; CHECK-NEXT: br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]] 28; CHECK: fp-to-i-if-end: 29; CHECK-NEXT: [[TMP9:%.*]] = add i129 [[TMP5]], -256 30; CHECK-NEXT: [[TMP10:%.*]] = icmp ult i129 [[TMP9]], -129 31; CHECK-NEXT: br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]] 32; CHECK: fp-to-i-if-then5: 33; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 34; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 35; CHECK: fp-to-i-if-end9: 36; CHECK-NEXT: [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 150 37; CHECK-NEXT: br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]] 38; CHECK: fp-to-i-if-then12: 39; CHECK-NEXT: [[TMP13:%.*]] = sub i129 150, [[TMP5]] 40; CHECK-NEXT: [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]] 41; CHECK-NEXT: [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]] 42; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 43; CHECK: fp-to-i-if-else: 44; CHECK-NEXT: [[TMP16:%.*]] = add i129 [[TMP5]], -150 45; CHECK-NEXT: [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]] 46; CHECK-NEXT: [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]] 47; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 48; CHECK: fp-to-i-cleanup: 49; CHECK-NEXT: [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ] 50; CHECK-NEXT: ret i129 [[TMP19]] 51; 52 %conv = fptosi float %a to i129 53 ret i129 %conv 54} 55 56define i129 @doubletosi129(double %a) { 57; CHECK-LABEL: @doubletosi129( 58; CHECK-NEXT: fp-to-i-entry: 59; CHECK-NEXT: [[TMP0:%.*]] = bitcast double [[A:%.*]] to i64 60; CHECK-NEXT: [[TMP1:%.*]] = zext i64 [[TMP0]] to i129 61; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], -1 62; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1 63; CHECK-NEXT: [[TMP4:%.*]] = lshr i129 [[TMP1]], 52 64; CHECK-NEXT: [[TMP5:%.*]] = and i129 [[TMP4]], 2047 65; CHECK-NEXT: [[TMP6:%.*]] = and i129 [[TMP1]], 4503599627370495 66; CHECK-NEXT: [[TMP7:%.*]] = or i129 [[TMP6]], 4503599627370496 67; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 1023 68; CHECK-NEXT: br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]] 69; CHECK: fp-to-i-if-end: 70; CHECK-NEXT: [[TMP9:%.*]] = add i129 [[TMP5]], -1152 71; CHECK-NEXT: [[TMP10:%.*]] = icmp ult i129 [[TMP9]], -129 72; CHECK-NEXT: br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]] 73; CHECK: fp-to-i-if-then5: 74; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 75; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 76; CHECK: fp-to-i-if-end9: 77; CHECK-NEXT: [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 1075 78; CHECK-NEXT: br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]] 79; CHECK: fp-to-i-if-then12: 80; CHECK-NEXT: [[TMP13:%.*]] = sub i129 1075, [[TMP5]] 81; CHECK-NEXT: [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]] 82; CHECK-NEXT: [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]] 83; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 84; CHECK: fp-to-i-if-else: 85; CHECK-NEXT: [[TMP16:%.*]] = add i129 [[TMP5]], -1075 86; CHECK-NEXT: [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]] 87; CHECK-NEXT: [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]] 88; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 89; CHECK: fp-to-i-cleanup: 90; CHECK-NEXT: [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ] 91; CHECK-NEXT: ret i129 [[TMP19]] 92; 93 %conv = fptosi double %a to i129 94 ret i129 %conv 95} 96 97define i129 @x86_fp80tosi129(x86_fp80 %a) { 98; CHECK-LABEL: @x86_fp80tosi129( 99; CHECK-NEXT: fp-to-i-entry: 100; CHECK-NEXT: [[TMP0:%.*]] = fpext x86_fp80 [[A:%.*]] to fp128 101; CHECK-NEXT: [[TMP1:%.*]] = bitcast fp128 [[TMP0]] to i128 102; CHECK-NEXT: [[TMP2:%.*]] = zext i128 [[TMP1]] to i129 103; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i128 [[TMP1]], -1 104; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i129 1, i129 -1 105; CHECK-NEXT: [[TMP5:%.*]] = lshr i129 [[TMP2]], 112 106; CHECK-NEXT: [[TMP6:%.*]] = and i129 [[TMP5]], 32767 107; CHECK-NEXT: [[TMP7:%.*]] = and i129 [[TMP2]], 5192296858534827628530496329220095 108; CHECK-NEXT: [[TMP8:%.*]] = or i129 [[TMP7]], 5192296858534827628530496329220096 109; CHECK-NEXT: [[TMP9:%.*]] = icmp ult i129 [[TMP6]], 16383 110; CHECK-NEXT: br i1 [[TMP9]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]] 111; CHECK: fp-to-i-if-end: 112; CHECK-NEXT: [[TMP10:%.*]] = add i129 [[TMP6]], -16512 113; CHECK-NEXT: [[TMP11:%.*]] = icmp ult i129 [[TMP10]], -129 114; CHECK-NEXT: br i1 [[TMP11]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]] 115; CHECK: fp-to-i-if-then5: 116; CHECK-NEXT: [[TMP12:%.*]] = select i1 [[TMP3]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 117; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 118; CHECK: fp-to-i-if-end9: 119; CHECK-NEXT: [[TMP13:%.*]] = icmp ult i129 [[TMP6]], 16495 120; CHECK-NEXT: br i1 [[TMP13]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]] 121; CHECK: fp-to-i-if-then12: 122; CHECK-NEXT: [[TMP14:%.*]] = sub i129 16495, [[TMP6]] 123; CHECK-NEXT: [[TMP15:%.*]] = lshr i129 [[TMP8]], [[TMP14]] 124; CHECK-NEXT: [[TMP16:%.*]] = mul i129 [[TMP15]], [[TMP4]] 125; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 126; CHECK: fp-to-i-if-else: 127; CHECK-NEXT: [[TMP17:%.*]] = add i129 [[TMP6]], -16495 128; CHECK-NEXT: [[TMP18:%.*]] = shl i129 [[TMP8]], [[TMP17]] 129; CHECK-NEXT: [[TMP19:%.*]] = mul i129 [[TMP18]], [[TMP4]] 130; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 131; CHECK: fp-to-i-cleanup: 132; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP12]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP16]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP19]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ] 133; CHECK-NEXT: ret i129 [[TMP20]] 134; 135 %conv = fptosi x86_fp80 %a to i129 136 ret i129 %conv 137} 138 139define i129 @fp128tosi129(fp128 %a) { 140; CHECK-LABEL: @fp128tosi129( 141; CHECK-NEXT: fp-to-i-entry: 142; CHECK-NEXT: [[TMP0:%.*]] = bitcast fp128 [[A:%.*]] to i128 143; CHECK-NEXT: [[TMP1:%.*]] = zext i128 [[TMP0]] to i129 144; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i128 [[TMP0]], -1 145; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1 146; CHECK-NEXT: [[TMP4:%.*]] = lshr i129 [[TMP1]], 112 147; CHECK-NEXT: [[TMP5:%.*]] = and i129 [[TMP4]], 32767 148; CHECK-NEXT: [[TMP6:%.*]] = and i129 [[TMP1]], 5192296858534827628530496329220095 149; CHECK-NEXT: [[TMP7:%.*]] = or i129 [[TMP6]], 5192296858534827628530496329220096 150; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 16383 151; CHECK-NEXT: br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]] 152; CHECK: fp-to-i-if-end: 153; CHECK-NEXT: [[TMP9:%.*]] = add i129 [[TMP5]], -16512 154; CHECK-NEXT: [[TMP10:%.*]] = icmp ult i129 [[TMP9]], -129 155; CHECK-NEXT: br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]] 156; CHECK: fp-to-i-if-then5: 157; CHECK-NEXT: [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 158; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 159; CHECK: fp-to-i-if-end9: 160; CHECK-NEXT: [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 16495 161; CHECK-NEXT: br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]] 162; CHECK: fp-to-i-if-then12: 163; CHECK-NEXT: [[TMP13:%.*]] = sub i129 16495, [[TMP5]] 164; CHECK-NEXT: [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]] 165; CHECK-NEXT: [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]] 166; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 167; CHECK: fp-to-i-if-else: 168; CHECK-NEXT: [[TMP16:%.*]] = add i129 [[TMP5]], -16495 169; CHECK-NEXT: [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]] 170; CHECK-NEXT: [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]] 171; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 172; CHECK: fp-to-i-cleanup: 173; CHECK-NEXT: [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ] 174; CHECK-NEXT: ret i129 [[TMP19]] 175; 176 %conv = fptosi fp128 %a to i129 177 ret i129 %conv 178} 179 180define <2 x i129> @floattosi129v2(<2 x float> %a) { 181; CHECK-LABEL: @floattosi129v2( 182; CHECK-NEXT: fp-to-i-entryfp-to-i-entry: 183; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x float> [[A:%.*]], i64 0 184; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP0]] to i32 185; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i129 186; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], -1 187; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i129 1, i129 -1 188; CHECK-NEXT: [[TMP5:%.*]] = lshr i129 [[TMP2]], 23 189; CHECK-NEXT: [[TMP6:%.*]] = and i129 [[TMP5]], 255 190; CHECK-NEXT: [[TMP7:%.*]] = and i129 [[TMP2]], 8388607 191; CHECK-NEXT: [[TMP8:%.*]] = or i129 [[TMP7]], 8388608 192; CHECK-NEXT: [[TMP9:%.*]] = icmp ult i129 [[TMP6]], 127 193; CHECK-NEXT: br i1 [[TMP9]], label [[FP_TO_I_CLEANUP1:%.*]], label [[FP_TO_I_IF_END2:%.*]] 194; CHECK: fp-to-i-if-end2: 195; CHECK-NEXT: [[TMP10:%.*]] = add i129 [[TMP6]], -256 196; CHECK-NEXT: [[TMP11:%.*]] = icmp ult i129 [[TMP10]], -129 197; CHECK-NEXT: br i1 [[TMP11]], label [[FP_TO_I_IF_THEN53:%.*]], label [[FP_TO_I_IF_END94:%.*]] 198; CHECK: fp-to-i-if-then53: 199; CHECK-NEXT: [[TMP12:%.*]] = select i1 [[TMP3]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 200; CHECK-NEXT: br label [[FP_TO_I_CLEANUP1]] 201; CHECK: fp-to-i-if-end94: 202; CHECK-NEXT: [[TMP13:%.*]] = icmp ult i129 [[TMP6]], 150 203; CHECK-NEXT: br i1 [[TMP13]], label [[FP_TO_I_IF_THEN125:%.*]], label [[FP_TO_I_IF_ELSE6:%.*]] 204; CHECK: fp-to-i-if-then125: 205; CHECK-NEXT: [[TMP14:%.*]] = sub i129 150, [[TMP6]] 206; CHECK-NEXT: [[TMP15:%.*]] = lshr i129 [[TMP8]], [[TMP14]] 207; CHECK-NEXT: [[TMP16:%.*]] = mul i129 [[TMP15]], [[TMP4]] 208; CHECK-NEXT: br label [[FP_TO_I_CLEANUP1]] 209; CHECK: fp-to-i-if-else6: 210; CHECK-NEXT: [[TMP17:%.*]] = add i129 [[TMP6]], -150 211; CHECK-NEXT: [[TMP18:%.*]] = shl i129 [[TMP8]], [[TMP17]] 212; CHECK-NEXT: [[TMP19:%.*]] = mul i129 [[TMP18]], [[TMP4]] 213; CHECK-NEXT: br label [[FP_TO_I_CLEANUP1]] 214; CHECK: fp-to-i-cleanup1: 215; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP12]], [[FP_TO_I_IF_THEN53]] ], [ [[TMP16]], [[FP_TO_I_IF_THEN125]] ], [ [[TMP19]], [[FP_TO_I_IF_ELSE6]] ], [ 0, [[FP_TO_I_ENTRYFP_TO_I_ENTRY:%.*]] ] 216; CHECK-NEXT: [[TMP21:%.*]] = insertelement <2 x i129> poison, i129 [[TMP20]], i64 0 217; CHECK-NEXT: [[TMP22:%.*]] = extractelement <2 x float> [[A]], i64 1 218; CHECK-NEXT: [[TMP23:%.*]] = bitcast float [[TMP22]] to i32 219; CHECK-NEXT: [[TMP24:%.*]] = zext i32 [[TMP23]] to i129 220; CHECK-NEXT: [[TMP25:%.*]] = icmp sgt i32 [[TMP23]], -1 221; CHECK-NEXT: [[TMP26:%.*]] = select i1 [[TMP25]], i129 1, i129 -1 222; CHECK-NEXT: [[TMP27:%.*]] = lshr i129 [[TMP24]], 23 223; CHECK-NEXT: [[TMP28:%.*]] = and i129 [[TMP27]], 255 224; CHECK-NEXT: [[TMP29:%.*]] = and i129 [[TMP24]], 8388607 225; CHECK-NEXT: [[TMP30:%.*]] = or i129 [[TMP29]], 8388608 226; CHECK-NEXT: [[TMP31:%.*]] = icmp ult i129 [[TMP28]], 127 227; CHECK-NEXT: br i1 [[TMP31]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]] 228; CHECK: fp-to-i-if-end: 229; CHECK-NEXT: [[TMP32:%.*]] = add i129 [[TMP28]], -256 230; CHECK-NEXT: [[TMP33:%.*]] = icmp ult i129 [[TMP32]], -129 231; CHECK-NEXT: br i1 [[TMP33]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]] 232; CHECK: fp-to-i-if-then5: 233; CHECK-NEXT: [[TMP34:%.*]] = select i1 [[TMP25]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456 234; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 235; CHECK: fp-to-i-if-end9: 236; CHECK-NEXT: [[TMP35:%.*]] = icmp ult i129 [[TMP28]], 150 237; CHECK-NEXT: br i1 [[TMP35]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]] 238; CHECK: fp-to-i-if-then12: 239; CHECK-NEXT: [[TMP36:%.*]] = sub i129 150, [[TMP28]] 240; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP30]], [[TMP36]] 241; CHECK-NEXT: [[TMP38:%.*]] = mul i129 [[TMP37]], [[TMP26]] 242; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 243; CHECK: fp-to-i-if-else: 244; CHECK-NEXT: [[TMP39:%.*]] = add i129 [[TMP28]], -150 245; CHECK-NEXT: [[TMP40:%.*]] = shl i129 [[TMP30]], [[TMP39]] 246; CHECK-NEXT: [[TMP41:%.*]] = mul i129 [[TMP40]], [[TMP26]] 247; CHECK-NEXT: br label [[FP_TO_I_CLEANUP]] 248; CHECK: fp-to-i-cleanup: 249; CHECK-NEXT: [[TMP42:%.*]] = phi i129 [ [[TMP34]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP38]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP41]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_CLEANUP1]] ] 250; CHECK-NEXT: [[TMP43:%.*]] = insertelement <2 x i129> [[TMP21]], i129 [[TMP42]], i64 1 251; CHECK-NEXT: ret <2 x i129> [[TMP43]] 252; 253 %conv = fptosi <2 x float> %a to <2 x i129> 254 ret <2 x i129> %conv 255} 256