stop time is not given (i.e, time string is 'x.y,') then analysis goes
        to end of file.
 
+       Also support time percent with multiple time range. Time string is
+       'a%/n,b%/m,...' or 'a%-b%,c%-%d,...'. The maximum number of slices is 10.
+
+       For example:
+       Select the second 10% time slice:
+
+         perf report --time 10%/2
+
+       Select from 0% to 10% time slice:
+
+         perf report --time 0%-10%
+
+       Select the first and second 10% time slices:
+
+         perf report --time 10%/1,10%/2
+
+       Select from 0% to 10% and 30% to 40% slices:
+
+         perf report --time 0%-10%,30%-40%
+
 --itrace::
        Options for decoding instruction tracing data. The options are:
 
 
 #include <sys/stat.h>
 #include <unistd.h>
 
+#define PTIME_RANGE_MAX        10
+
 struct report {
        struct perf_tool        tool;
        struct perf_session     *session;
        const char              *cpu_list;
        const char              *symbol_filter_str;
        const char              *time_str;
-       struct perf_time_interval ptime;
+       struct perf_time_interval ptime_range[PTIME_RANGE_MAX];
+       int                     range_num;
        float                   min_percent;
        u64                     nr_entries;
        u64                     queue_size;
        };
        int ret = 0;
 
-       if (perf_time__skip_sample(&rep->ptime, sample->time))
+       if (perf_time__ranges_skip_sample(rep->ptime_range, rep->range_num,
+                                         sample->time)) {
                return 0;
+       }
 
        if (machine__resolve(machine, &al, sample) < 0) {
                pr_debug("problem processing %d event, skipping it.\n",
        if (symbol__init(&session->header.env) < 0)
                goto error;
 
-       if (perf_time__parse_str(&report.ptime, report.time_str) != 0) {
-               pr_err("Invalid time string\n");
-               return -EINVAL;
+       if (perf_time__parse_str(report.ptime_range, report.time_str) != 0) {
+               if (session->evlist->first_sample_time == 0 &&
+                   session->evlist->last_sample_time == 0) {
+                       pr_err("No first/last sample time in perf data\n");
+                       return -EINVAL;
+               }
+
+               report.range_num = perf_time__percent_parse_str(
+                                       report.ptime_range, PTIME_RANGE_MAX,
+                                       report.time_str,
+                                       session->evlist->first_sample_time,
+                                       session->evlist->last_sample_time);
+
+               if (report.range_num < 0) {
+                       pr_err("Invalid time string\n");
+                       return -EINVAL;
+               }
+       } else {
+               report.range_num = 1;
        }
 
        sort__setup_elide(stdout);