382 lines · c
1// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNPADDED2// 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,PADDED3 4// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,UNPADDED5// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,PADDED6 7// Fixed point against other fixed point8_Bool b_eq_true = 2.5hk == 2.5uhk; // CHECK-DAG: @b_eq_true = {{.*}}global i8 1, align 19_Bool b_eq_false = 2.5hk == 2.4uhk; // CHECK-DAG: @b_eq_false = {{.*}}global i8 0, align 110 11_Bool b_ne_true = 2.5hk != 2.4uhk; // CHECK-DAG: @b_ne_true = {{.*}}global i8 1, align 112_Bool b_ne_false = 2.5hk != 2.5uhk; // CHECK-DAG: @b_ne_false = {{.*}}global i8 0, align 113 14_Bool b_lt_true = 2.5hk < 2.75uhk; // CHECK-DAG: @b_lt_true = {{.*}}global i8 1, align 115_Bool b_lt_false = 2.5hk < 2.5uhk; // CHECK-DAG: @b_lt_false = {{.*}}global i8 0, align 116 17_Bool b_le_true = 2.5hk <= 2.75uhk; // CHECK-DAG: @b_le_true = {{.*}}global i8 1, align 118_Bool b_le_true2 = 2.5hk <= 2.5uhk; // CHECK-DAG: @b_le_true2 = {{.*}}global i8 1, align 119_Bool b_le_false = 2.5hk <= 2.4uhk; // CHECK-DAG: @b_le_false = {{.*}}global i8 0, align 120 21_Bool b_gt_true = 2.75hk > 2.5uhk; // CHECK-DAG: @b_gt_true = {{.*}}global i8 1, align 122_Bool b_gt_false = 2.75hk > 2.75uhk; // CHECK-DAG: @b_gt_false = {{.*}}global i8 0, align 123 24_Bool b_ge_true = 2.75hk >= 2.5uhk; // CHECK-DAG: @b_ge_true = {{.*}}global i8 1, align 125_Bool b_ge_true2 = 2.75hk >= 2.75uhk; // CHECK-DAG: @b_ge_true2 = {{.*}}global i8 1, align 126_Bool b_ge_false = 2.5hk >= 2.75uhk; // CHECK-DAG: @b_ge_false = {{.*}}global i8 0, align 127 28// Fixed point against int29_Bool b_ieq_true = 2.0hk == 2; // CHECK-DAG: @b_ieq_true = {{.*}}global i8 1, align 130_Bool b_ieq_false = 2.0hk == 3; // CHECK-DAG: @b_ieq_false = {{.*}}global i8 0, align 131 32_Bool b_ine_true = 2.0hk != 3; // CHECK-DAG: @b_ine_true = {{.*}}global i8 1, align 133_Bool b_ine_false = 2.0hk != 2; // CHECK-DAG: @b_ine_false = {{.*}}global i8 0, align 134 35_Bool b_ilt_true = 2.0hk < 3; // CHECK-DAG: @b_ilt_true = {{.*}}global i8 1, align 136_Bool b_ilt_false = 2.0hk < 2; // CHECK-DAG: @b_ilt_false = {{.*}}global i8 0, align 137 38_Bool b_ile_true = 2.0hk <= 3; // CHECK-DAG: @b_ile_true = {{.*}}global i8 1, align 139_Bool b_ile_true2 = 2.0hk <= 2; // CHECK-DAG: @b_ile_true2 = {{.*}}global i8 1, align 140_Bool b_ile_false = 2.0hk <= 1; // CHECK-DAG: @b_ile_false = {{.*}}global i8 0, align 141 42_Bool b_igt_true = 2.0hk > 1; // CHECK-DAG: @b_igt_true = {{.*}}global i8 1, align 143_Bool b_igt_false = 2.0hk > 2; // CHECK-DAG: @b_igt_false = {{.*}}global i8 0, align 144 45_Bool b_ige_true = 2.0hk >= 1; // CHECK-DAG: @b_ige_true = {{.*}}global i8 1, align 146_Bool b_ige_true2 = 2.0hk >= 2; // CHECK-DAG: @b_ige_true2 = {{.*}}global i8 1, align 147_Bool b_ige_false = 2.0hk >= 3; // CHECK-DAG: @b_ige_false = {{.*}}global i8 0, align 148 49// Different signage50// Since we can have different precisions, non powers of 2 fractions may have51// different actual values when being compared.52_Bool b_sne_true = 2.6hk != 2.6uhk;53// UNPADDED-DAG: @b_sne_true = {{.*}}global i8 1, align 154// PADDED-DAG: @b_sne_true = {{.*}}global i8 0, align 155 56_Bool b_seq_true = 2.0hk == 2u; // CHECK-DAG: @b_seq_true = {{.*}}global i8 1, align 157_Bool b_seq_true2 = 2.0uhk == 2; // CHECK-DAG: @b_seq_true2 = {{.*}}global i8 1, align 158 59void TestComparisons(void) {60 short _Accum sa;61 _Accum a;62 unsigned short _Accum usa;63 unsigned _Accum ua;64 65 // Each of these should be a fixed point conversion followed by the actual66 // comparison operation.67 sa == a;68 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 269 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 470 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3271 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 872 // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]73 74 sa != a;75 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 276 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 477 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3278 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 879 // CHECK-NEXT: {{.*}} = icmp ne i32 [[UPSCALE_A]], [[A2]]80 81 sa > a;82 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 283 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 484 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3285 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 886 // CHECK-NEXT: {{.*}} = icmp sgt i32 [[UPSCALE_A]], [[A2]]87 88 sa >= a;89 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 290 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 491 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3292 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 893 // CHECK-NEXT: {{.*}} = icmp sge i32 [[UPSCALE_A]], [[A2]]94 95 sa < a;96 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 297 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 498 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3299 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8100 // CHECK-NEXT: {{.*}} = icmp slt i32 [[UPSCALE_A]], [[A2]]101 102 sa <= a;103 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2104 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4105 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32106 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8107 // CHECK-NEXT: {{.*}} = icmp sle i32 [[UPSCALE_A]], [[A2]]108 109 usa > ua;110 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2111 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4112 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32113 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8114 // CHECK-NEXT: {{.*}} = icmp ugt i32 [[UPSCALE_A]], [[A2]]115 116 usa >= ua;117 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2118 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4119 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32120 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8121 // CHECK-NEXT: {{.*}} = icmp uge i32 [[UPSCALE_A]], [[A2]]122 123 usa < ua;124 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2125 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4126 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32127 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8128 // CHECK-NEXT: {{.*}} = icmp ult i32 [[UPSCALE_A]], [[A2]]129 130 usa <= ua;131 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2132 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4133 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32134 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8135 // CHECK-NEXT: {{.*}} = icmp ule i32 [[UPSCALE_A]], [[A2]]136}137 138void TestIntComparisons(void) {139 short _Accum sa;140 unsigned short _Accum usa;141 142 int i;143 unsigned int ui;144 _Bool b;145 char c;146 short s;147 enum E {148 A = 2149 } e;150 151 // These comparisons shouldn't be that different from comparing against fixed152 // point types with other fixed point types.153 sa == i;154 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2155 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4156 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39157 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39158 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7159 // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]160 161 sa != i;162 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2163 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4164 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39165 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39166 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7167 // CHECK-NEXT: {{.*}} = icmp ne i39 [[RESIZE_A]], [[UPSCALE_I]]168 169 sa > i;170 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2171 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4172 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39173 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39174 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7175 // CHECK-NEXT: {{.*}} = icmp sgt i39 [[RESIZE_A]], [[UPSCALE_I]]176 177 sa >= i;178 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2179 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4180 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39181 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39182 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7183 // CHECK-NEXT: {{.*}} = icmp sge i39 [[RESIZE_A]], [[UPSCALE_I]]184 185 sa < i;186 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2187 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4188 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39189 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39190 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7191 // CHECK-NEXT: {{.*}} = icmp slt i39 [[RESIZE_A]], [[UPSCALE_I]]192 193 sa <= i;194 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2195 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4196 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39197 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39198 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7199 // CHECK-NEXT: {{.*}} = icmp sle i39 [[RESIZE_A]], [[UPSCALE_I]]200 201 usa > ui;202 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2203 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4204 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40205 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40206 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8207 // UNPADDED-NEXT: {{.*}} = icmp ugt i40 [[RESIZE_A]], [[UPSCALE_I]]208 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39209 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39210 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7211 // PADDED-NEXT: {{.*}} = icmp ugt i39 [[RESIZE_A]], [[UPSCALE_I]]212 213 usa >= ui;214 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2215 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4216 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40217 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40218 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8219 // UNPADDED-NEXT: {{.*}} = icmp uge i40 [[RESIZE_A]], [[UPSCALE_I]]220 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39221 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39222 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7223 // PADDED-NEXT: {{.*}} = icmp uge i39 [[RESIZE_A]], [[UPSCALE_I]]224 225 usa < ui;226 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2227 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4228 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40229 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40230 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8231 // UNPADDED-NEXT: {{.*}} = icmp ult i40 [[RESIZE_A]], [[UPSCALE_I]]232 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39233 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39234 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7235 // PADDED-NEXT: {{.*}} = icmp ult i39 [[RESIZE_A]], [[UPSCALE_I]]236 237 usa <= ui;238 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2239 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4240 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40241 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40242 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8243 // UNPADDED-NEXT: {{.*}} = icmp ule i40 [[RESIZE_A]], [[UPSCALE_I]]244 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39245 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39246 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7247 // PADDED-NEXT: {{.*}} = icmp ule i39 [[RESIZE_A]], [[UPSCALE_I]]248 249 // Allow for comparisons with other int like types. These are no different250 // from comparing to an int other than varying sizes. The integer types are251 // still converted to ints or unsigned ints from UsualUnaryConversions().252 sa == b;253 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2254 // CHECK-NEXT: [[B:%[0-9]+]] = load i8, ptr %b, align 1255 // CHECK-NEXT: %loadedv = trunc i8 [[B]] to i1256 // CHECK-NEXT: [[CONV_B:%[a-z0-9]+]] = zext i1 %loadedv to i32257 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39258 // CHECK-NEXT: [[RESIZE_B:%[a-z0-9]+]] = sext i32 [[CONV_B]] to i39259 // CHECK-NEXT: [[UPSCALE_B:%[a-z0-9]+]] = shl i39 [[RESIZE_B]], 7260 // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_B]]261 262 sa == c;263 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2264 // CHECK-NEXT: [[C:%[0-9]+]] = load i8, ptr %c, align 1265 // CHECK-NEXT: [[CONV_C:%[a-z0-9]+]] = sext i8 [[C]] to i32266 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39267 // CHECK-NEXT: [[RESIZE_C:%[a-z0-9]+]] = sext i32 [[CONV_C]] to i39268 // CHECK-NEXT: [[UPSCALE_C:%[a-z0-9]+]] = shl i39 [[RESIZE_C]], 7269 // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_C]]270 271 sa == s;272 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2273 // CHECK-NEXT: [[S:%[0-9]+]] = load i16, ptr %s, align 2274 // CHECK-NEXT: [[CONV_S:%[a-z0-9]+]] = sext i16 [[S]] to i32275 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39276 // CHECK-NEXT: [[RESIZE_S:%[a-z0-9]+]] = sext i32 [[CONV_S]] to i39277 // CHECK-NEXT: [[UPSCALE_S:%[a-z0-9]+]] = shl i39 [[RESIZE_S]], 7278 // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_S]]279 280 // An enum value is IntegralCast to an unsigned int.281 usa == e;282 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2283 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %e, align 4284 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40285 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40286 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8287 // UNPADDED-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]288 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39289 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39290 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7291 // PADDED-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]292}293 294void TestComparisonSignage(void) {295 short _Accum sa;296 unsigned short _Accum usa;297 int i;298 unsigned int ui;299 300 // Signed vs unsigned fixed point comparison301 sa == usa;302 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2303 // CHECK-NEXT: [[A2:%[0-9]+]] = load i16, ptr %usa, align 2304 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i17305 // UNPADDED-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i17 [[RESIZE_A]], 1306 // UNPADDED-NEXT: [[RESIZE_A2:%[a-z0-9]+]] = zext i16 [[A2]] to i17307 // UNPADDED-NEXT: {{.*}} = icmp eq i17 [[UPSCALE_A]], [[RESIZE_A2]]308 // PADDED-NEXT: {{.*}} = icmp eq i16 [[A]], [[A2]]309 310 // Signed int vs unsigned fixed point311 sa == ui;312 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2313 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4314 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i40315 // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40316 // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 7317 // CHECK-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]318 319 // Signed fixed point vs unsigned int320 usa == i;321 // CHECK: [[A:%[0-9]+]] = load i16, ptr %usa, align 2322 // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4323 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40324 // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i40325 // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8326 // UNPADDED-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]327 // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39328 // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39329 // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7330 // PADDED-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]331}332 333void TestSaturationComparisons(void) {334 short _Accum sa;335 _Accum a;336 _Sat short _Accum sat_sa;337 _Sat _Accum sat_a;338 _Sat unsigned short _Accum sat_usa;339 340 // These are effectively the same as conversions with their non-saturating341 // counterparts since when comparing, we convert both operands to a common342 // type that should be able to hold both values.343 sat_sa == sat_a;344 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2345 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %sat_a, align 4346 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32347 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8348 // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]349 350 sat_sa == a;351 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2352 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4353 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32354 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8355 // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]356 357 sat_sa == sat_usa;358 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2359 // CHECK-NEXT: [[A2:%[0-9]+]] = load i16, ptr %sat_usa, align 2360 // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i17361 // UNPADDED-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i17 [[RESIZE_A]], 1362 // UNPADDED-NEXT: [[RESIZE_A2:%[a-z0-9]+]] = zext i16 [[A2]] to i17363 // UNPADDED-NEXT: {{.*}} = icmp eq i17 [[UPSCALE_A]], [[RESIZE_A2]]364 // PADDED-NEXT: {{.*}} = icmp eq i16 [[A]], [[A2]]365}366 367void StoreBooleanResult(void) {368 short _Accum sa;369 _Accum a;370 int res;371 372 // Check that the result can properly be stored as an int.373 res = sa == a;374 // CHECK: [[A:%[0-9]+]] = load i16, ptr %sa, align 2375 // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4376 // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32377 // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8378 // CHECK-NEXT: [[RES:%[0-9]+]] = icmp eq i32 [[UPSCALE_A]], [[A2]]379 // CHECK-NEXT: %conv = zext i1 [[RES]] to i32380 // CHECK-NEXT: store i32 %conv, ptr %res, align 4381}382