586 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: @ssub_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:%.*]] = sub i16 [[TMP0]], [[TMP1]]36// CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 237// CHECK-NEXT: ret void38//39void ssub_sasasa(void) {40 sa = sa - sa;41}42 43// CHECK-LABEL: @ssub_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:%.*]] = sub i32 [[UPSCALE]], [[TMP1]]50// CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 451// CHECK-NEXT: ret void52//53void ssub_asaa(void) {54 a = sa - a;55}56 57// CHECK-LABEL: @ssub_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:%.*]] = sub i16 [[TMP0]], [[RESIZE]]63// CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 264// CHECK-NEXT: ret void65//66void ssub_sasasf(void) {67 sa = sa - sf;68}69 70// CHECK-LABEL: @ssub_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:%.*]] = sub 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 ssub_sasaf(void) {84 sa = sa - f;85}86 87// CHECK-LABEL: @ssub_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:%.*]] = sub i32 [[TMP0]], [[UPSCALE]]94// CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 495// CHECK-NEXT: ret void96//97void ssub_aasf(void) {98 a = a - sf;99}100 101// CHECK-LABEL: @ssub_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:%.*]] = sub 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 ssub_aalf(void) {115 a = a - lf;116}117 118// SIGNED-LABEL: @ssub_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:%.*]] = sub 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: @ssub_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:%.*]] = sub i16 [[TMP0]], [[TMP1]]136// UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2137// UNSIGNED-NEXT: ret void138//139void ssub_sasausa(void) {140 sa = sa - usa;141}142 143// SIGNED-LABEL: @ssub_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:%.*]] = sub 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: @ssub_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:%.*]] = sub i32 [[UPSCALE]], [[TMP1]]163// UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4164// UNSIGNED-NEXT: ret void165//166void ssub_asaua(void) {167 a = sa - ua;168}169 170// SIGNED-LABEL: @ssub_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:%.*]] = sub 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: @ssub_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:%.*]] = sub i16 [[TMP0]], [[RESIZE]]189// UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2190// UNSIGNED-NEXT: ret void191//192void ssub_sasausf(void) {193 sa = sa - usf;194}195 196// SIGNED-LABEL: @ssub_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:%.*]] = sub 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: @ssub_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:%.*]] = sub 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 ssub_sasaulf(void) {223 sa = sa - ulf;224}225 226// CHECK-LABEL: @ssub_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:%.*]] = sub i32 [[TMP0]], [[TMP1]]231// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr @a3, align 4232// CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]]233// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr @a4, align 4234// CHECK-NEXT: [[TMP6:%.*]] = sub i32 [[TMP4]], [[TMP5]]235// CHECK-NEXT: store i32 [[TMP6]], ptr @a, align 4236// CHECK-NEXT: ret void237//238void ssub_aaaaa(void) {239 a = a - a2 - a3 - a4;240}241 242 243// CHECK-LABEL: @usub_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:%.*]] = sub i16 [[TMP0]], [[TMP1]]248// CHECK-NEXT: store i16 [[TMP2]], ptr @usa, align 2249// CHECK-NEXT: ret void250//251void usub_usausausa(void) {252 usa = usa - usa;253}254 255// CHECK-LABEL: @usub_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:%.*]] = sub i32 [[UPSCALE]], [[TMP1]]262// CHECK-NEXT: store i32 [[TMP2]], ptr @ua, align 4263// CHECK-NEXT: ret void264//265void usub_uausaua(void) {266 ua = usa - ua;267}268 269// CHECK-LABEL: @usub_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:%.*]] = sub i16 [[TMP0]], [[RESIZE]]275// CHECK-NEXT: store i16 [[TMP2]], ptr @usa, align 2276// CHECK-NEXT: ret void277//278void usub_usausausf(void) {279 usa = usa - usf;280}281 282// CHECK-LABEL: @usub_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:%.*]] = sub 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 usub_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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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:%.*]] = sub 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.ssub.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.usub.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.ssub.sat.i16(i16 [[TMP0]], i16 [[TMP1]])448// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp slt i16 [[TMP2]], 0449// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP3]], i16 0, i16 [[TMP2]]450// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15451// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16452// UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @usa_sat, align 2453// UNSIGNED-NEXT: ret void454//455void sat_usasusausas(void) {456 usa_sat = usa - usa_sat;457}458 459// SIGNED-LABEL: @sat_uasuausas(460// SIGNED-NEXT: entry:461// SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4462// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2463// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32464// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8465// SIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]])466// SIGNED-NEXT: store i32 [[TMP2]], ptr @ua_sat, align 4467// SIGNED-NEXT: ret void468//469// UNSIGNED-LABEL: @sat_uasuausas(470// UNSIGNED-NEXT: entry:471// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4472// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2473// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32474// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8475// UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]])476// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0477// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]478// UNSIGNED-NEXT: [[RESIZE1:%.*]] = trunc i32 [[SATMIN]] to i31479// UNSIGNED-NEXT: [[RESIZE2:%.*]] = zext i31 [[RESIZE1]] to i32480// UNSIGNED-NEXT: store i32 [[RESIZE2]], ptr @ua_sat, align 4481// UNSIGNED-NEXT: ret void482//483void sat_uasuausas(void) {484 ua_sat = ua - usa_sat;485}486 487// CHECK-LABEL: @sat_sassasi(488// CHECK-NEXT: entry:489// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2490// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4491// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i39492// CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39493// CHECK-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7494// CHECK-NEXT: [[TMP2:%.*]] = call i39 @llvm.ssub.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]])495// CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767496// CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]497// CHECK-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], -32768498// CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 -32768, i39 [[SATMAX]]499// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16500// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2501// CHECK-NEXT: ret void502//503void sat_sassasi(void) {504 sa_sat = sa_sat - i;505}506 507// CHECK-LABEL: @sat_sassasui(508// CHECK-NEXT: entry:509// CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2510// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4511// CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40512// CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40513// CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 7514// CHECK-NEXT: [[TMP2:%.*]] = call i40 @llvm.ssub.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]])515// CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 32767516// CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 32767, i40 [[TMP2]]517// CHECK-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], -32768518// CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 -32768, i40 [[SATMAX]]519// CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16520// CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2521// CHECK-NEXT: ret void522//523void sat_sassasui(void) {524 sa_sat = sa_sat - ui;525}526 527// SIGNED-LABEL: @sat_ufsufsufs(528// SIGNED-NEXT: entry:529// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2530// SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2531// SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[TMP0]], i16 [[TMP1]])532// SIGNED-NEXT: store i16 [[TMP2]], ptr @uf_sat, align 2533// SIGNED-NEXT: ret void534//535// UNSIGNED-LABEL: @sat_ufsufsufs(536// UNSIGNED-NEXT: entry:537// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2538// UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2539// UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.ssub.sat.i16(i16 [[TMP0]], i16 [[TMP1]])540// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp slt i16 [[TMP2]], 0541// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP3]], i16 0, i16 [[TMP2]]542// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15543// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16544// UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @uf_sat, align 2545// UNSIGNED-NEXT: ret void546//547void sat_ufsufsufs(void) {548 uf_sat = uf_sat - uf_sat;549}550 551// SIGNED-LABEL: @sat_usasusasi(552// SIGNED-NEXT: entry:553// SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2554// SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4555// SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40556// SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i40557// SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8558// SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.ssub.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]])559// SIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 65535560// SIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 65535, i40 [[TMP2]]561// SIGNED-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], 0562// SIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 0, i40 [[SATMAX]]563// SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16564// SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2565// SIGNED-NEXT: ret void566//567// UNSIGNED-LABEL: @sat_usasusasi(568// UNSIGNED-NEXT: entry:569// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2570// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4571// UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39572// UNSIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39573// UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7574// UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.ssub.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]])575// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767576// UNSIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]577// UNSIGNED-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], 0578// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 0, i39 [[SATMAX]]579// UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16580// UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2581// UNSIGNED-NEXT: ret void582//583void sat_usasusasi(void) {584 usa_sat = usa_sat - i;585}586