Viewing file: min_plus_1.c (2.78 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do run } */ /* { dg-options "-O2 --save-temps" } */ /* { dg-final { check-function-bodies "**" "" "" } } */
/* ** f1: ** subs (w[0-9]+), w0, #?4 ** csel w0, \1, wzr, l[te] ** ret */ /* ** f2: ** subs (w[0-9]+), w0, #?4 ** csel w0, \1, wzr, l[te] ** ret */ /* ** f3: ** subs (w[0-9]+), w0, #?3 ** csinc w0, \1, wzr, le ** ret */ /* ** f4: ** subs (w[0-9]+), w0, #?5 ** csinv w0, \1, wzr, lt ** ret */
#ifndef TYPE #define TYPE int32_t #define TYPE_MIN INT32_MIN #define TYPE_MAX INT32_MAX #define VALUE 4 #endif
#include <stdint.h>
TYPE __attribute__((noipa)) f1 (TYPE x) { return (x < VALUE ? x - VALUE : 0); }
TYPE __attribute__((noipa)) f2 (TYPE x) { return (x < VALUE ? x : VALUE) - VALUE; }
TYPE __attribute__((noipa)) f3 (TYPE x) { return (x < VALUE ? x : VALUE) - (VALUE - 1); }
TYPE __attribute__((noipa)) f4 (TYPE x) { return (x < VALUE ? x : VALUE) - (VALUE + 1); }
TYPE __attribute__((noipa)) f5 (TYPE x) { return (x < VALUE ? x : VALUE) - (VALUE + 2); }
TYPE __attribute__((noipa)) f6 (TYPE x) { return (x < VALUE ? x : VALUE) - (VALUE - 2); }
int main (void) { TYPE min_test = TYPE_MIN; if (TYPE_MIN < 0 && VALUE > 0) min_test += VALUE;
if (f1 (min_test) != min_test - VALUE) __builtin_abort (); if (f1 (VALUE - 1) != -1) __builtin_abort (); if (f1 (VALUE) != 0) __builtin_abort (); if (f1 (VALUE + 1) != 0) __builtin_abort (); if (f1 (TYPE_MAX) != 0) __builtin_abort ();
if (f2 (min_test) != min_test - VALUE) __builtin_abort (); if (f2 (VALUE - 1) != -1) __builtin_abort (); if (f2 (VALUE) != 0) __builtin_abort (); if (f2 (VALUE + 1) != 0) __builtin_abort (); if (f2 (TYPE_MAX) != 0) __builtin_abort ();
if (f3 (min_test) != min_test - VALUE + 1) __builtin_abort (); if (f3 (VALUE - 1) != 0) __builtin_abort (); if (f3 (VALUE) != 1) __builtin_abort (); if (f3 (VALUE + 1) != 1) __builtin_abort (); if (f3 (TYPE_MAX) != 1) __builtin_abort ();
if (f4 (min_test + 1) != min_test - VALUE) __builtin_abort (); if (f4 (VALUE - 1) != -2) __builtin_abort (); if (f4 (VALUE) != -1) __builtin_abort (); if (f4 (VALUE + 1) != -1) __builtin_abort (); if (f4 (TYPE_MAX) != -1) __builtin_abort ();
if (VALUE >= min_test + 2 && f5 (min_test + 2) != min_test - VALUE) __builtin_abort (); if (f5 (VALUE - 1) != -3) __builtin_abort (); if (f5 (VALUE) != -2) __builtin_abort (); if (f5 (VALUE + 1) != -2) __builtin_abort (); if (f5 (TYPE_MAX) != -2) __builtin_abort ();
if (f6 (min_test) != min_test - VALUE + 2) __builtin_abort (); if (f6 (VALUE - 1) != 1) __builtin_abort (); if (f6 (VALUE) != 2) __builtin_abort (); if (f6 (VALUE + 1) != 2) __builtin_abort (); if (f6 (TYPE_MAX) != 2) __builtin_abort ();
return 0; }
|