580 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,SIGNED3// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNSIGNED4 5short _Accum sa;6_Accum a, a2, a3, a4;7long _Accum la;8unsigned short _Accum usa;9unsigned _Accum ua;10unsigned long _Accum ula;11 12short _Fract sf;13_Fract f;14long _Fract lf;15unsigned short _Fract usf;16unsigned _Fract uf;17unsigned long _Fract ulf;18 19_Sat short _Accum sa_sat;20_Sat _Accum a_sat;21_Sat long _Accum la_sat;22_Sat unsigned short _Accum usa_sat;23_Sat unsigned _Accum ua_sat;24_Sat unsigned long _Accum ula_sat;25_Sat unsigned _Fract uf_sat;26 27int i;28unsigned int ui;29_Bool b;30 31// CHECK-LABEL: @sadd_sasasa(32// CHECK-NEXT: entry:33// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 234// CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @sa, align 235// CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]]36// CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 237// CHECK-NEXT: ret void38//39void sadd_sasasa(void) {40 sa = sa + sa;41}42 43// CHECK-LABEL: @sadd_asaa(44// CHECK-NEXT: entry:45// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 246// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 447// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i3248// CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 849// CHECK-NEXT: [[TMP2:%.*]] = add i32 [[UPSCALE]], [[TMP1]]50// CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 451// CHECK-NEXT: ret void52//53void sadd_asaa(void) {54 a = sa + a;55}56 57// CHECK-LABEL: @sadd_sasasf(58// CHECK-NEXT: entry:59// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 260// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @sf, align 161// CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i1662// CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[RESIZE]]63// CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 264// CHECK-NEXT: ret void65//66void sadd_sasasf(void) {67 sa = sa + sf;68}69 70// CHECK-LABEL: @sadd_sasaf(71// CHECK-NEXT: entry:72// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 273// CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @f, align 274// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i2475// CHECK-NEXT: [[UPSCALE:%.*]] = shl i24 [[RESIZE]], 876// CHECK-NEXT: [[RESIZE1:%.*]] = sext i16 [[TMP1]] to i2477// CHECK-NEXT: [[TMP2:%.*]] = add i24 [[UPSCALE]], [[RESIZE1]]78// CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i24 [[TMP2]], 879// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i24 [[DOWNSCALE]] to i1680// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 281// CHECK-NEXT: ret void82//83void sadd_sasaf(void) {84 sa = sa + f;85}86 87// CHECK-LABEL: @sadd_aasf(88// CHECK-NEXT: entry:89// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 490// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @sf, align 191// CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i3292// CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 893// CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[UPSCALE]]94// CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 495// CHECK-NEXT: ret void96//97void sadd_aasf(void) {98 a = a + sf;99}100 101// CHECK-LABEL: @sadd_aalf(102// CHECK-NEXT: entry:103// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4104// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @lf, align 4105// CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i48106// CHECK-NEXT: [[UPSCALE:%.*]] = shl i48 [[RESIZE]], 16107// CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i48108// CHECK-NEXT: [[TMP2:%.*]] = add i48 [[UPSCALE]], [[RESIZE1]]109// CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i48 [[TMP2]], 16110// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i48 [[DOWNSCALE]] to i32111// CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4112// CHECK-NEXT: ret void113//114void sadd_aalf(void) {115 a = a + lf;116}117 118// SIGNED-LABEL: @sadd_sasausa(119// SIGNED-NEXT: entry:120// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2121// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2122// SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i17123// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE]], 1124// SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i17125// SIGNED-NEXT: [[TMP2:%.*]] = add i17 [[UPSCALE]], [[RESIZE1]]126// SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1127// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16128// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2129// SIGNED-NEXT: ret void130//131// UNSIGNED-LABEL: @sadd_sasausa(132// UNSIGNED-NEXT: entry:133// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2134// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2135// UNSIGNED-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]]136// UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2137// UNSIGNED-NEXT: ret void138//139void sadd_sasausa(void) {140 sa = sa + usa;141}142 143// SIGNED-LABEL: @sadd_asaua(144// SIGNED-NEXT: entry:145// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2146// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4147// SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i33148// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 9149// SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i33150// SIGNED-NEXT: [[TMP2:%.*]] = add i33 [[UPSCALE]], [[RESIZE1]]151// SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1152// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32153// SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4154// SIGNED-NEXT: ret void155//156// UNSIGNED-LABEL: @sadd_asaua(157// UNSIGNED-NEXT: entry:158// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2159// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4160// UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i32161// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8162// UNSIGNED-NEXT: [[TMP2:%.*]] = add i32 [[UPSCALE]], [[TMP1]]163// UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4164// UNSIGNED-NEXT: ret void165//166void sadd_asaua(void) {167 a = sa + ua;168}169 170// SIGNED-LABEL: @sadd_sasausf(171// SIGNED-NEXT: entry:172// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2173// SIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1174// SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i17175// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE]], 1176// SIGNED-NEXT: [[RESIZE1:%.*]] = zext i8 [[TMP1]] to i17177// SIGNED-NEXT: [[TMP2:%.*]] = add i17 [[UPSCALE]], [[RESIZE1]]178// SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1179// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16180// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2181// SIGNED-NEXT: ret void182//183// UNSIGNED-LABEL: @sadd_sasausf(184// UNSIGNED-NEXT: entry:185// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2186// UNSIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1187// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i8 [[TMP1]] to i16188// UNSIGNED-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[RESIZE]]189// UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2190// UNSIGNED-NEXT: ret void191//192void sadd_sasausf(void) {193 sa = sa + usf;194}195 196// SIGNED-LABEL: @sadd_sasaulf(197// SIGNED-NEXT: entry:198// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2199// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ulf, align 4200// SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i41201// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i41 [[RESIZE]], 25202// SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i41203// SIGNED-NEXT: [[TMP2:%.*]] = add i41 [[UPSCALE]], [[RESIZE1]]204// SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i41 [[TMP2]], 25205// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i41 [[DOWNSCALE]] to i16206// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2207// SIGNED-NEXT: ret void208//209// UNSIGNED-LABEL: @sadd_sasaulf(210// UNSIGNED-NEXT: entry:211// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2212// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ulf, align 4213// UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40214// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE]], 24215// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40216// UNSIGNED-NEXT: [[TMP2:%.*]] = add i40 [[UPSCALE]], [[RESIZE1]]217// UNSIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i40 [[TMP2]], 24218// UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[DOWNSCALE]] to i16219// UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2220// UNSIGNED-NEXT: ret void221//222void sadd_sasaulf(void) {223 sa = sa + ulf;224}225 226// CHECK-LABEL: @sadd_aaaaa(227// CHECK-NEXT: entry:228// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4229// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a2, align 4230// CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP0]], [[TMP1]]231// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr @a3, align 4232// CHECK-NEXT: [[TMP4:%.*]] = add i32 [[TMP2]], [[TMP3]]233// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr @a4, align 4234// CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP4]], [[TMP5]]235// CHECK-NEXT: store i32 [[TMP6]], ptr @a, align 4236// CHECK-NEXT: ret void237//238void sadd_aaaaa(void) {239 a = a + a2 + a3 + a4;240}241 242 243// CHECK-LABEL: @uadd_usausausa(244// CHECK-NEXT: entry:245// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2246// CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2247// CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[TMP1]]248// CHECK-NEXT: store i16 [[TMP2]], ptr @usa, align 2249// CHECK-NEXT: ret void250//251void uadd_usausausa(void) {252 usa = usa + usa;253}254 255// CHECK-LABEL: @uadd_uausaua(256// CHECK-NEXT: entry:257// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2258// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4259// CHECK-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32260// CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8261// CHECK-NEXT: [[TMP2:%.*]] = add i32 [[UPSCALE]], [[TMP1]]262// CHECK-NEXT: store i32 [[TMP2]], ptr @ua, align 4263// CHECK-NEXT: ret void264//265void uadd_uausaua(void) {266 ua = usa + ua;267}268 269// CHECK-LABEL: @uadd_usausausf(270// CHECK-NEXT: entry:271// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2272// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1273// CHECK-NEXT: [[RESIZE:%.*]] = zext i8 [[TMP1]] to i16274// CHECK-NEXT: [[TMP2:%.*]] = add i16 [[TMP0]], [[RESIZE]]275// CHECK-NEXT: store i16 [[TMP2]], ptr @usa, align 2276// CHECK-NEXT: ret void277//278void uadd_usausausf(void) {279 usa = usa + usf;280}281 282// CHECK-LABEL: @uadd_usausauf(283// CHECK-NEXT: entry:284// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2285// CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2286// CHECK-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i24287// CHECK-NEXT: [[UPSCALE:%.*]] = shl i24 [[RESIZE]], 8288// CHECK-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i24289// CHECK-NEXT: [[TMP2:%.*]] = add i24 [[UPSCALE]], [[RESIZE1]]290// CHECK-NEXT: [[DOWNSCALE:%.*]] = lshr i24 [[TMP2]], 8291// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i24 [[DOWNSCALE]] to i16292// CHECK-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2293// CHECK-NEXT: ret void294//295void uadd_usausauf(void) {296 usa = usa + uf;297}298 299 300// CHECK-LABEL: @int_sasai(301// CHECK-NEXT: entry:302// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2303// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4304// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i39305// CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39306// CHECK-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7307// CHECK-NEXT: [[TMP2:%.*]] = add i39 [[RESIZE]], [[UPSCALE]]308// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16309// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2310// CHECK-NEXT: ret void311//312void int_sasai(void) {313 sa = sa + i;314}315 316// CHECK-LABEL: @int_sasaui(317// CHECK-NEXT: entry:318// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2319// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4320// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40321// CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40322// CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 7323// CHECK-NEXT: [[TMP2:%.*]] = add i40 [[RESIZE]], [[UPSCALE]]324// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16325// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2326// CHECK-NEXT: ret void327//328void int_sasaui(void) {329 sa = sa + ui;330}331 332// SIGNED-LABEL: @int_usausai(333// SIGNED-NEXT: entry:334// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2335// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4336// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40337// SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i40338// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8339// SIGNED-NEXT: [[TMP2:%.*]] = add i40 [[RESIZE]], [[UPSCALE]]340// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16341// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2342// SIGNED-NEXT: ret void343//344// UNSIGNED-LABEL: @int_usausai(345// UNSIGNED-NEXT: entry:346// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2347// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4348// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39349// UNSIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39350// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7351// UNSIGNED-NEXT: [[TMP2:%.*]] = add i39 [[RESIZE]], [[UPSCALE]]352// UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16353// UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2354// UNSIGNED-NEXT: ret void355//356void int_usausai(void) {357 usa = usa + i;358}359 360// SIGNED-LABEL: @int_usausaui(361// SIGNED-NEXT: entry:362// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2363// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4364// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40365// SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40366// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8367// SIGNED-NEXT: [[TMP2:%.*]] = add i40 [[RESIZE]], [[UPSCALE]]368// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16369// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2370// SIGNED-NEXT: ret void371//372// UNSIGNED-LABEL: @int_usausaui(373// UNSIGNED-NEXT: entry:374// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2375// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4376// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39377// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i39378// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7379// UNSIGNED-NEXT: [[TMP2:%.*]] = add i39 [[RESIZE]], [[UPSCALE]]380// UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16381// UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2382// UNSIGNED-NEXT: ret void383//384void int_usausaui(void) {385 usa = usa + ui;386}387 388// CHECK-LABEL: @int_lflfui(389// CHECK-NEXT: entry:390// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @lf, align 4391// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4392// CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i64393// CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i64394// CHECK-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE1]], 31395// CHECK-NEXT: [[TMP2:%.*]] = add i64 [[RESIZE]], [[UPSCALE]]396// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i64 [[TMP2]] to i32397// CHECK-NEXT: store i32 [[RESIZE2]], ptr @lf, align 4398// CHECK-NEXT: ret void399//400void int_lflfui(void) {401 lf = lf + ui;402}403 404// CHECK-LABEL: @int_aab(405// CHECK-NEXT: entry:406// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4407// CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @b, align 1408// CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP1]] to i1409// CHECK-NEXT: [[CONV:%.*]] = zext i1 [[TOBOOL]] to i32410// CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i47411// CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[CONV]] to i47412// CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15413// CHECK-NEXT: [[TMP2:%.*]] = add i47 [[RESIZE]], [[UPSCALE]]414// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32415// CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4416// CHECK-NEXT: ret void417//418void int_aab(void) {419 a = a + b;420}421 422 423// CHECK-LABEL: @sat_sassasas(424// CHECK-NEXT: entry:425// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2426// CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @sa_sat, align 2427// CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 [[TMP1]])428// CHECK-NEXT: store i16 [[TMP2]], ptr @sa_sat, align 2429// CHECK-NEXT: ret void430//431void sat_sassasas(void) {432 sa_sat = sa + sa_sat;433}434 435// SIGNED-LABEL: @sat_usasusausas(436// SIGNED-NEXT: entry:437// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2438// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2439// SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[TMP0]], i16 [[TMP1]])440// SIGNED-NEXT: store i16 [[TMP2]], ptr @usa_sat, align 2441// SIGNED-NEXT: ret void442//443// UNSIGNED-LABEL: @sat_usasusausas(444// UNSIGNED-NEXT: entry:445// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2446// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2447// UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 [[TMP1]])448// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP2]] to i15449// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16450// UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @usa_sat, align 2451// UNSIGNED-NEXT: ret void452//453void sat_usasusausas(void) {454 usa_sat = usa + usa_sat;455}456 457// SIGNED-LABEL: @sat_uasuausas(458// SIGNED-NEXT: entry:459// SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4460// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2461// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32462// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8463// SIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]])464// SIGNED-NEXT: store i32 [[TMP2]], ptr @ua_sat, align 4465// SIGNED-NEXT: ret void466//467// UNSIGNED-LABEL: @sat_uasuausas(468// UNSIGNED-NEXT: entry:469// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4470// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2471// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32472// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8473// UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]])474// UNSIGNED-NEXT: [[RESIZE1:%.*]] = trunc i32 [[TMP2]] to i31475// UNSIGNED-NEXT: [[RESIZE2:%.*]] = zext i31 [[RESIZE1]] to i32476// UNSIGNED-NEXT: store i32 [[RESIZE2]], ptr @ua_sat, align 4477// UNSIGNED-NEXT: ret void478//479void sat_uasuausas(void) {480 ua_sat = ua + usa_sat;481}482 483// CHECK-LABEL: @sat_sassasi(484// CHECK-NEXT: entry:485// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2486// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4487// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i39488// CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39489// CHECK-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7490// CHECK-NEXT: [[TMP2:%.*]] = call i39 @llvm.sadd.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]])491// CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767492// CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]493// CHECK-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], -32768494// CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 -32768, i39 [[SATMAX]]495// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16496// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2497// CHECK-NEXT: ret void498//499void sat_sassasi(void) {500 sa_sat = sa_sat + i;501}502 503// CHECK-LABEL: @sat_sassasui(504// CHECK-NEXT: entry:505// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2506// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4507// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40508// CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40509// CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 7510// CHECK-NEXT: [[TMP2:%.*]] = call i40 @llvm.sadd.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]])511// CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 32767512// CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 32767, i40 [[TMP2]]513// CHECK-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], -32768514// CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 -32768, i40 [[SATMAX]]515// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16516// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2517// CHECK-NEXT: ret void518//519void sat_sassasui(void) {520 sa_sat = sa_sat + ui;521}522 523// SIGNED-LABEL: @sat_ufsufsufs(524// SIGNED-NEXT: entry:525// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2526// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2527// SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[TMP0]], i16 [[TMP1]])528// SIGNED-NEXT: store i16 [[TMP2]], ptr @uf_sat, align 2529// SIGNED-NEXT: ret void530//531// UNSIGNED-LABEL: @sat_ufsufsufs(532// UNSIGNED-NEXT: entry:533// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2534// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2535// UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 [[TMP1]])536// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP2]] to i15537// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16538// UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @uf_sat, align 2539// UNSIGNED-NEXT: ret void540//541void sat_ufsufsufs(void) {542 uf_sat = uf_sat + uf_sat;543}544 545// SIGNED-LABEL: @sat_usasusasi(546// SIGNED-NEXT: entry:547// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2548// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4549// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40550// SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i40551// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8552// SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.sadd.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]])553// SIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 65535554// SIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 65535, i40 [[TMP2]]555// SIGNED-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], 0556// SIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 0, i40 [[SATMAX]]557// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16558// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2559// SIGNED-NEXT: ret void560//561// UNSIGNED-LABEL: @sat_usasusasi(562// UNSIGNED-NEXT: entry:563// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2564// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4565// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39566// UNSIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39567// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7568// UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.sadd.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]])569// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767570// UNSIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]571// UNSIGNED-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], 0572// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 0, i39 [[SATMAX]]573// UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16574// UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2575// UNSIGNED-NEXT: ret void576//577void sat_usasusasi(void) {578 usa_sat = usa_sat + i;579}580